C - 创建数组"normally"和使用 malloc 的区别



我弄乱了 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(),也会引入内存泄漏。

简洁的部分是您的字符串正好是四个字符,因此这不应该损坏字符串末尾的空终止符''。让我猜猜,你看到正好四个垃圾字符?

相关内容

  • 没有找到相关文章

最新更新