我弄乱了 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";
将起作用。
注意:如果这样做,则不会调用free(array)
,因为它不是指向动态分配的内存的指针,并且不需要动态返回到堆中。它存在于堆栈上。继续阅读...
但这里foo()
的功能是问题所在。当调用foo()
时,字符串truc
(也可以声明为char truc[] = "then";
)存在于堆栈帧中,堆栈帧是程序内存的一部分,仅在foo()
返回之前存在。如果将array
更改为指向该堆栈帧中的内存,当该函数返回时会发生什么情况?该堆栈帧变得未定义,您只能指向垃圾内存。
如果要更改array
中字符串的内容,则可以确保缓冲区足够长,并且foo()
可以strcpy(array, "then")
到其中。因此,您不会更改指针本身,只是更改它指向的内存。这不是我所说的好的软件设计,但为了一个例子,它会为你工作。喜欢这个:
void foo(char * ptr)
{
strcpy(ptr, "then");
}
那么为什么没有malloc()
main()
就不起作用呢?
当你不malloc()
main()
时,array
表示,正如它所暗示的那样,一个数组。标识符本身不是指针,它是一个数组;但是,它会衰减到指针,或者如果您愿意,可以像指针一样运行。这就是为什么如果你愿意,你可以把它作为一个传递,就像你把它传递给foo()
一样。现在,如果你引用array
的地址,比如&array
、(char*)array
、&array
、&array[0]
都是一样的——指向array
开头的指针。在这种情况下,您的foo()
实际上是将内存地址写入array
的内存。
这是做什么的?好吧,技术答案是未定义的行为。但我猜它正在将一个 32 位整数(内存地址)写入一个内存块,该内存块用于表示字符串中的 4 个 8 位字符。所以现在你已经损坏了正好四个字符。而且,如果foo()
像您显示的那样使用malloc()
,也会引入内存泄漏。
简洁的部分是您的字符串正好是四个字符,因此这不应该损坏字符串末尾的空终止符' '
。让我猜猜,你看到正好四个垃圾字符?