使用for循环给内存地址赋值时出错的技术求助
问题根源:未初始化的指针
keyword 你两段代码的核心问题都不是for循环,而是char *keyword;这行——你声明了一个字符指针,但没有给它分配任何有效的内存空间,也没有让它指向一块可写的内存区域。
当你用scanf("%s", keyword);时,scanf会尝试把输入的字符串写入keyword指向的地址,但这个地址是随机的(未初始化的指针值是垃圾值),这属于未定义行为:
- 第一段代码崩溃、第二段看似能运行,都是未定义行为的随机结果,和for循环无关。
- 另外,
if (keyword == NULL)这个判断完全无效,未初始化的指针不会自动变为NULL,它的值是随机的垃圾值。
修正方案
你有两种可靠的解决思路:
方式1:使用固定大小的字符数组
如果能预估输入字符串的最大长度,直接声明数组是最简单的方案:
#include <stdio.h> #include <string.h> #include <stdlib.h> int main(void) { // 定义足够大的数组,这里允许最多输入100个字符(+1用于存储字符串结束符'\0') char keyword[101]; printf("keyword: "); // 使用带长度限制的%s,避免缓冲区溢出 scanf("%100s", keyword); char *t = malloc(strlen(keyword) + 1); if (t == NULL) return 1; // 可以直接用strcpy替代手动循环,更简洁且不易出错 strcpy(t, keyword); // 如果你坚持用手动循环,原循环逻辑是正确的(前提是keyword有效) // for (int i = 0, n = strlen(keyword) + 1; i < n; i++) // t[i] = keyword[i]; printf("t: %s\n", t); free(t); return 0; }
方式2:动态分配内存给keyword
如果不想限制输入长度,可以用getline动态读取输入,自动分配足够的内存:
#include <stdio.h> #include <string.h> #include <stdlib.h> int main(void) { char *keyword = NULL; size_t len = 0; printf("keyword: "); // getline会自动分配足够的内存存储输入 if (getline(&keyword, &len, stdin) == -1) { perror("读取输入失败"); return 1; } // 去掉getline读取到的换行符 keyword[strcspn(keyword, "\n")] = '\0'; char *t = malloc(strlen(keyword) + 1); if (t == NULL) { free(keyword); return 1; } strcpy(t, keyword); printf("t: %s\n", t); free(t); free(keyword); return 0; }
额外提示
- 你原代码中的for循环逻辑是正确的,它完整复制了包括字符串结束符
\0在内的所有字符,问题出在keyword本身无效。 - 处理字符串复制时,优先使用标准库函数
strcpy或memcpy,比手动循环更高效且不易出错。 - 永远不要使用未初始化的指针,这是C编程中最常见的陷阱之一。
内容的提问来源于stack exchange,提问作者Woodrow
相关产品推荐
相关产品推荐

