N维世界 2023-12-10 09:36 采纳率: 88.2%
浏览 3

为什么说正在从'c'读取无效数据和未初始化内存c


#include <stdio.h>


int main()
{
    char a[] = "abdgikm", b[] = "cefhjlnop", c[81];
    int i = 0, j = 0, k = 0;
    while (a[i] != '\0' && b[j] != '\0')
    {
        if (a[i] < b[j]) { i++; j++; }
        else c[k] = b[j];
        k++;
    }
    c[k]=c[k-1];
    printf("%s\n", c);

}
  • 写回答

3条回答 默认 最新

  • &春风有信 2023-12-10 10:50
    关注

    你的代码试图合并两个字符串"abdgikm"和"cefhjlnop",并在合并过程中,如果遇到其中一个字符串中的字符比另一个中的字符小,就先移动较小的字符。然后,你的代码将结果存储在字符数组"c"中,并打印出结果。

    然而,你的代码中存在几个问题:

    在C语言中,字符串是以'\0'(空字符)结尾的。在你的代码中,数组"c"并没有初始化,这意味着它可能包含任何随机数据。如果你试图访问未初始化的内存,程序可能会产生未定义的行为,这可能包括崩溃、产生垃圾数据,或者其他的异常行为。
    在你的代码中,你试图将字符数组"b"中的字符逐个复制到"c"中,但你并没有为数组"c"预留足够的空间来存储完整的字符数组"b"。因此,你可能在试图向数组"c"写入数据时超出其界限,这也可能导致未定义的行为。
    解决上述问题的一种方法是:

    初始化数组"c",使其内容为'\0'。
    确保你有足够的空间来存储合并后的字符串。
    修改后的代码如下:

    #include <stdio.h>
    
    int main()
    {
        char a[] = "abdgikm", b[] = "cefhjlnop", c[81] = ""; // initialize c with empty string
        int i = 0, j = 0, k = 0;
        while (a[i] != '\0' && b[j] != '\0')
        {
            if (a[i] < b[j]) { i++; j++; }
            else { c[k] = b[j]; j++; } // update j here to ensure we copy all characters from array b
            k++;
        }
        while (a[i] != '\0') { c[k++] = a[i++]; } // copy remaining characters from array a, if any
        c[k] = '\0'; // append the null character at the end of the string
        printf("%s\n", c);
    }
    
    

    这段代码会先比较两个数组中的字符,然后复制较小的字符,然后再复制剩余的字符。最后,它会在字符串的末尾添加一个空字符,以确保字符串以正确的格式结束。

    评论

报告相同问题?

问题事件

  • 创建了问题 12月10日

悬赏问题

  • ¥15 关于一个倒计时的操作和显示设计
  • ¥15 提问STK的问题,哪位航天领域的同学会啊
  • ¥15 苹果系统的mac m1芯片的笔记本使用ce修改器使用不了
  • ¥15 单相逆变的电压电流双闭环中进行低通滤波PID算法改进
  • ¥15 关于#java#的问题,请各位专家解答!
  • ¥15 如何卸载arcgis 10.1 data reviewer for desktop
  • ¥15 共享文件夹会话中为什么会有WORKGROUP
  • ¥15 关于#python#的问题:使用ATL02数据解算光子脚点的坐标(操作系统-windows)
  • ¥115 关于#python#的问题:未加密前两个软件都可以打开,加密后只有A软件可打开,B软件可以打开但读取不了数据
  • ¥15 在matlab中Application Compiler后的软件无法打开