char*变量内存分配机制及strcat使用的内存疑问
关于C语言指针内存分配与strcat使用的疑问
先看这段代码:
int main() { char* currentWorkingDirectory = getcwd(NULL, 0); char* moviesFileDir = currentWorkingDirectory; char* buyersFileDir = currentWorkingDirectory; strcat(moviesFileDir, "\\Movies.txt"); strcat(buyersFileDir, "dljasdoihjawuieyawodiujasiodyhawoirasioufgyaisdufghytewdasasasasasasasasasasasasasasasasasasasasasasasasasasasaaaaaaaaaaaaaaaaaaaaaaa"); printf("Directory: %s\n", moviesFileDir); printf("Directory: %s\n", buyersFileDir); return 0; }
问题解答
moviesFileDir和buyersFileDir的内存分配:这两个指针本身是栈上分配的普通变量,并没有单独申请堆内存,它们只是直接指向了
currentWorkingDirectory所指向的内存块。而currentWorkingDirectory的内存是getcwd(NULL, 0)调用时自动通过malloc分配的,大小刚好能容纳当前工作目录的字符串(包含终止符)。strcat未手动扩容却能执行?:这不是正常的“实现了扩容”,而是未定义行为。
getcwd分配的内存仅够存储原路径字符串,strcat会从字符串末尾开始追加内容,直接超出了已分配的内存边界,破坏了堆上的其他数据。代码能运行只是运气好没立刻崩溃,但本质是非法内存访问,随时可能导致程序崩溃、数据损坏等问题。malloc初始化后执行strcat是否需要realloc?:是的,必须确保内存空间足够容纳原字符串加上追加的内容。如果初始
malloc的空间不够,直接调用strcat会触发内存越界,同样属于未定义行为。正确做法是先计算所需总长度,要么一开始就malloc足够的空间,要么先用realloc扩容后再执行strcat。
内容的提问来源于stack exchange,提问作者Bejinariu Paul Catalin
相关产品推荐
相关产品推荐

