我在学习时涉及到了函数中的C指向指针的操作。我创建了一个字符串数组,并希望通过指向指针的方式在函数foo
中对其进行更改。然后我将其打印出来,只是为了看看结果。
问题在于:如果我正常地创建它:char array[] = "yeah"
,那么代码无法正常运行,控制台会输出一堆奇怪的字符。但是,如果我使用malloc
来创建它,则可以正常工作。我真的想理解其中的区别。
这个可以工作:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void foo(char **ptr);
int main(int argc, char *argv[]) {
char *array = malloc(sizeof("yeah")); //I need to malloc here, or it doesn't work. Why ?
strcpy(array, "yeah");
printf("array before : %s \n", array);
char *ptr = array;
char **pt = &ptr;
foo(&array);
printf("array after : %s \n", array);
free(array);
}
void foo(char **ptr) {
char *truc = malloc(sizeof(char) * 20); //I need to malloc here, else it doesn't work. Why ?
strcpy(truc, "then");
*ptr = truc;
}
但是这样做不行,控制台会显示诡异的字符:
void foo(char **ptr);
int main(int argc, char *argv[]) {
char array[] = "yeah"; //created "normally"
printf("array before : %s \n", array);
char *ptr = array;
char **pt = &ptr;
foo(&array);
printf("array after : %s \n", array);
free(array);
}
void foo(char **ptr) {
char truc = "then";
*ptr = truc;
}
以下两者有什么不同:
char array[] = "yeah";
并且
char *array = malloc(sizeof("yeah");
strcpy(array, "yeah");
char array[] = "yeah";
更改为char* array = "yeah";
,它对我来说很好用。 - Michael Bianconiint *a; a = malloc(...)
和int a[] = ...
之间的区别与int x= 5
和5
之间的区别相同。 - Lee Daniel Crockerfoo
使用malloc
获取一个新值并覆盖了main
中的array
指针。旧值是之前调用malloc
时获取的,现在已经无法访问。foo(&array)
表示:“这是我的非const
指针的地址:如果你愿意,你可以覆盖它”,而foo
正是这样做的,而没有释放它。 - Kaz