You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 16:45:44