【发布时间】:2020-12-15 10:48:49
【问题描述】:
我有一些关于在辅助函数中将值分配给 char* 的问题。如果我有以下代码
int main() {
char *p = malloc(6* sizeof(char));
changeValue(p);
printf("value of p=%s\n", p);
return 0;
}
如果我定义以下函数,那么它不起作用:
void changeValue(char* input){
input = "hello";
}
我的第一个问题是我们不能直接为指针赋值的原因是什么? 我之前的理解是因为空间“hello”只在changeValue作用域内创建,一旦脱离changeValue函数,就被销毁了。但是,如果我使用指针的指针来分配它的值。似乎“你好”空间没有被破坏:
void changeValue(char ** input){
*input = "hello";
}
主要我需要更改为:
char **p2 = malloc(sizeof(char*));
changeValue(p2);
printf("value of p2=%s\n", *p2);
而且它工作正常。我的第二个问题是,第二个函数发生了什么才能使其正常工作,我之前的逻辑中哪个部分出错了?
我还找到了以下赋值方式:
changeValue函数保持不变:
void changeValue(char ** input){
*input = "hello";
}
在主 cpp 中我做了以下操作:
char *p = malloc(6* sizeof(char));
changeValue(&p);
printf("value of p=%s\n", p);
似乎它也可以正常工作,但对我来说没有任何意义。我的第三个问题是输入是内存中 p 的地址,如何取消引用地址并为其赋值?
在辅助函数中分配 char* 值的正确方法是什么?
谢谢
【问题讨论】:
-
"hello"是一个字符串字面量,它的生命周期是整个程序的持续时间 -
你所有的例子都泄露了
malloc分配的内存 -
"我的第一个问题是我们不能直接为指针赋值的原因是什么?" 你可以。您只是分配给在函数参数列表中创建的指针的 copy,因为 C 总是按值/副本传递。所以外面看不到变化。要更改在函数外部看到的值,您必须传递一个指向它的指针,在这种情况下是一个指向指针的指针。然后,您可以取消引用该指针以获取其指向的可修改左值。抱歉,这是基本的指针用法,应该在对指针概念的任何半体面的介绍中进行解释。
-
您可以使用
void changeValue(char *input) { strcpy(input, "hello"); }完成第一个版本。这会更改input(以及main()中的p)指向的6 字节块,而不是更改指针本身。 -
这取决于你想做什么。当然,您可以复制指向字符串文字的指针。只要确保你永远不会通过指针修改字符串文字的内容,因为这会导致未定义的行为。
标签: c pointers char dereference