C 指向指针分配的指针

标签 c pointers memory-management malloc

我有有效的代码,但我不太明白为什么。我正在分配一个带有字符串的指针,将该字符串传递给一个函数,然后修改它。我很困惑,即使输入的字符串远大于原始字符串,它似乎也能正常运行。我希望它会提示覆盖内存,特别是因为原始指针不是 MALLOC/CALLOCed。

void changeArray(char *(*anArray)[3]);

函数声明

char *testArray[] = { "This is a test", "A Second Test", "A Third Test" };

指针声明和初始化

    changeArray(&testArray);

函数调用

void changeArray(char *(*anArray)[3]){
char userName[200];
printf("What is your name?:\t");
scanf("%199[^\n]s", userName);
*anArray[0] = userName; }

函数

    printf("Your name is: %s\n", testArray[0]);

在main中打印结果。

为什么 testArray[0] 能够在不重新分配内存的情况下接受新字符串?更令人困惑的是,我在 locals 下查看结果,它看起来已损坏,但仍然打印正常。

+       [0] 0x00e2f850 "D`\x3\x1 øâ"    char *

我知道询问工作代码很奇怪,但我需要确保我了解正在发生的事情,以便我以后可以正确实现/避免它。

最佳答案

您混淆了字符串和指针。 C 中的“字符串”是内存中的字符数组,通常由指向数组开头的指针引用。所以当你声明

char *testArray[] = { "This is a test", "A Second Test", "A Third Test" };

这将 testArray 声明为一个包含 3 个指针的数组,并将每个指针初始化为指向一个静态字符串(字符数组可能在只读内存中)。

在您的 changeArray 函数中,您有:

char userName[200];
printf("What is your name?:\t");
scanf("%199[^\n]s", userName);
*anArray[0] = userName;

这会创建一个新的本地字符数组,并用用户输入(大概是他们的名字)填充它,然后将数组中的第 0 个指针作为参数指向这个本地变量。一旦这个函数返回,堆栈帧将被释放,指针悬空(指向现在释放的堆栈帧)因此它可能看起来有效但随后似乎随机变化。在退出范围后访问这样的局部变量是未定义的行为——任何事情都可能发生。

关于C 指向指针分配的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28082584/

相关文章:

c - 将c字符串解析为指针数组时出现段错误

c - 内核模式访问用户空间变量

c - OpenGL 背景颜色渐变器

c - 为什么二维数组可以从 int ** 转换为 int * ,而指针数组却不能

c - 如何循环 <windows.h> system ("color") 命令以使命令提示符快速改变其颜色?

c - 在 Unix 中使用 fchmod

linux - SD 卡中的精简配置

c - 如何连续声明结构而不将其设为数组?

c - 全局变量的乘法声明/定义

c - C 中的变量,可接受值的范围有限