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语言的编译原理没搞清楚啊。。。。。你把地址的地址传进去,再取出来不就得了。。。。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。