c语言函数参数泛类型指针参数问题? 400 报错
typedef long intptr_t;
int sapi_header_set_status(void *arg){ printf("%ld", (int)(intptr_t) arg); }
intptr_t status_code = 400; sapi_header_set_status(&status_code);
 
 
@中山野鬼 为什么不能正确打印出 400,而是 56686416?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
兄弟,你打印的是status_code变量的地址。######楼上说的正确呀。你打印出来的是,status_code里面的值copy到堆栈里的某个空间的地址。为啥是copy到堆栈里,你看看函数调用的原理就知道了。实在不行,反汇编一下你的函数调用。哈######
@chen.sy @中山野鬼 多谢 多谢, 也解决了我所期望的结果
sapi_header_set_status((void *) (intptr_t) status_code);######
#include <stdio.h>
typedef long intptr_t;
int sapi_header_set_status(void *arg){
    printf("%ld", *((intptr_t*) arg));
}
int main()
{
    intptr_t status_code = 400;
    sapi_header_set_status(&status_code);
} 
 你这个方法,虽然能得出你的结果, 但是不是一般void*指针的用法. 你想要的东西在上面.
void *的一般用法是: 你可以传任何指针变量(注意是指针变量,你原来的做法, status_code并不是一个指针变量,你只不过强制转换骗编译器而已,&status_code才是指针);但是你其实知道你想要的是什么指针(int*还是char*);所以你在函数里将void*转化为你知道的指针(你的函数实际想要的是long*,所以我们转为long*);
这也是一切变量无类型的脚本语言的基础.
 
 
#include <stdio.h>
typedef long intptr_t;
int sapi_header_set_status(void *arg){
    printf("%ld", *((intptr_t*) arg));
}
int main()
{
    intptr_t status_code = 400;
    sapi_header_set_status(&status_code);
} 
   你这个方法,虽然能得出你的结果, 但是不是一般void*指针的用法. 你想要的东西在上面.
void *的一般用法是: 你可以传任何指针变量(注意是指针变量,你原来的做法, status_code并不是一个指针变量,你只不过强制转换骗编译器而已,&status_code才是指针);但是你其实知道你想要的是什么指针(int*还是char*);所以你在函数里将void*转化为你知道的指针(你的函数实际想要的是long*,所以我们转为long*);
这也是一切变量无类型的脚本语言的基础.
 
 
是的,但是这里是需要调用别的api,这个api,没法去改变了。我提问时,只把没有问题的地方提取出来了,完整的代码是:
 
 
typedef enum {					/* Parameter: 			*/
	SAPI_HEADER_REPLACE,		/* sapi_header_line* 	*/
	SAPI_HEADER_ADD,			/* sapi_header_line* 	*/
	SAPI_HEADER_DELETE,			/* sapi_header_line* 	*/
	SAPI_HEADER_DELETE_ALL,		/* void					*/
	SAPI_HEADER_SET_STATUS		/* int 					*/
} sapi_header_op_enum;
static void sapi_update_response_code(int ncode TSRMLS_DC){
} 
SAPI_API int sapi_header_op(sapi_header_op_enum op, void *arg TSRMLS_DC)
{
    switch (op) {
        case SAPI_HEADER_SET_STATUS:
            /* 设置 HTTP 状态码 */
            sapi_update_response_code((int)(zend_intptr_t) arg TSRMLS_CC);
            return SUCCESS;
        case SAPI_HEADER_ADD:
        case SAPI_HEADER_REPLACE:
        case SAPI_HEADER_DELETE: {
               /* 添加、替换、删除 HTTP 头 */
                break;
            }
        case SAPI_HEADER_DELETE_ALL:
            /* 清除所有 HTTP 头 */
            return SUCCESS;
        default:
            return FAILURE;
    }
    ... ...
} 如果我只需要改变当前http的状态码,在调用 sapi_update_response_code 
  时,期望结果就是一个int,而在添加、修改时,期望救过就是一个 char 指针 
  
  
  
 
#include <stdio.h>
typedef long intptr_t;
int sapi_header_set_status(void *arg){
    printf("%ld", *((intptr_t*) arg));
}
int main()
{
    intptr_t status_code = 400;
    sapi_header_set_status(&status_code);
} 
     你这个方法,虽然能得出你的结果, 但是不是一般void*指针的用法. 你想要的东西在上面.
void *的一般用法是: 你可以传任何指针变量(注意是指针变量,你原来的做法, status_code并不是一个指针变量,你只不过强制转换骗编译器而已,&status_code才是指针);但是你其实知道你想要的是什么指针(int*还是char*);所以你在函数里将void*转化为你知道的指针(你的函数实际想要的是long*,所以我们转为long*);
这也是一切变量无类型的脚本语言的基础.
 
 
是的,但是这里是需要调用别的api,这个api,没法去改变了。我提问时,只把没有问题的地方提取出来了,完整的代码是:
 
 
typedef enum {					/* Parameter: 			*/
	SAPI_HEADER_REPLACE,		/* sapi_header_line* 	*/
	SAPI_HEADER_ADD,			/* sapi_header_line* 	*/
	SAPI_HEADER_DELETE,			/* sapi_header_line* 	*/
	SAPI_HEADER_DELETE_ALL,		/* void					*/
	SAPI_HEADER_SET_STATUS		/* int 					*/
} sapi_header_op_enum;
static void sapi_update_response_code(int ncode TSRMLS_DC){
} 
SAPI_API int sapi_header_op(sapi_header_op_enum op, void *arg TSRMLS_DC)
{
    switch (op) {
        case SAPI_HEADER_SET_STATUS:
            /* 设置 HTTP 状态码 */
            sapi_update_response_code((int)(zend_intptr_t) arg TSRMLS_CC);
            return SUCCESS;
        case SAPI_HEADER_ADD:
        case SAPI_HEADER_REPLACE:
        case SAPI_HEADER_DELETE: {
               /* 添加、替换、删除 HTTP 头 */
                break;
            }
        case SAPI_HEADER_DELETE_ALL:
            /* 清除所有 HTTP 头 */
            return SUCCESS;
        default:
            return FAILURE;
    }
    ... ...
} 如果我只需要改变当前http的状态码,在调用 sapi_update_response_code 
    时,期望结果就是一个int,而在添加、修改时,期望救过就是一个 char 指针 
    
    
    
 
C语言的编译原理没搞清楚啊。。。。。你把地址的地址传进去,再取出来不就得了。。。。