c 语言,有关指针将一个字符串作为参数传入函数的问题

嘿嘿嘿嘿嘿 发布于 2014/06/30 12:44
阅读 8K+
收藏 0

先上代码:

#include <stdio.h>

void test(char *p) {
	p = "1234";
}
int main() {
	char *p = "abcd";
test(p);
printf("p: %s\r\n", p);
return 0;
}

这儿main()调用test(),传入指针p,test()里面将p指向了“1234”,test()结束,这样执行下一句打印p的字符串的时候,p不是应该是指向“1234”了吗?按我的理解,输出应该是p:1234了,但是在VC里面执行出来的结果是p:abcd。

想问下前辈们,我的问题出在哪儿呢?



加载中
0
T
Tudorex

c中本质上是没有字符串的,像“abcd“, ”1234“这些属于字符串常量, 编译后一般属于.rdata汇编段, 你在c中操作这些字符串常量的时候实际上代表的是这些字符串常量的保存地址, 你调用函数传入char *p, 这个p虽然是指针, 但它其实就是个在函数体内部有存在意义的形式变量, 你只改变了*p的指向(p=”1234“), 却不修改*p指向的空间的内容, 自然在函数返回后这个p的存在被销毁, 而原先的字符串常量的位置分文未动。

如果你直接去修改”abcd"所在的内存linux直接报段错误, 猜想这个字符串常量所在的段被操作系统装载后在权限上不能被修改,正如你不可能依靠物理地址随意修改其他进程的内存空间一样

嘿嘿嘿嘿嘿
多谢解惑,基本上明白了。
0
记住一座城
记住一座城

形参不能改变实参的值,你要传入指针的指针

void test(char **p) {
04     *p = "1234";
05 }

0
大连馋师
大连馋师

C的基础问题~  有关形参、实参。C++里面可以传入引用。

0
0
中山野鬼
中山野鬼
概念不清。哈。。。。传入函数的参数的方式要搞清楚哦。。。
返回顶部
顶部