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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 04:12:43