c - 解码这些 Valgrind 调试器内存错误在我的代码中意味着什么

标签 c arrays memory segmentation-fault valgrind

这里是 c 的相当新的学生。刚刚完成了 Linux 子系统的设置,因此我可以运行 Valgrind 进行调试。我正在处理一个需要多个字符串数组并有组织地存储这些值的作业。我相信我的代码的逻辑是合理的,但是当它运行时它会立即退出进程,我什至没有时间输入程序将运行的 n 次。我认为这是一个段错误,并下载了 valgrind 来查明问题所在。但是我无法理解这些错误消息的含义。似乎只有一两个错误,但我可能是错的。我可能需要使用动态内存函数(malloc、calloc...)来使其工作,但在内存分配方面我更像是一个初学者,甚至不确定从哪里开始。任何关于我的 valgrind 错误意味着什么,或者我应该如何动态分配内存的建议将不胜感激 :)

任何人需要的任何其他信息,请随时询问。

我消除了所有我知道可以解决的错误。现在只剩下这两个了。我相信这与段错误或未正确分配内存有关,但我不确定。

这是我当前的代码。它可能有点乱,或者有不好的空格。我也乐于接受对我的编码风格的批评 :)

    int main() {
int n, i, j = 0, k, m, p, flag, key, count;
char choiceUQ, choiceSS[100];
char nameTemp[100], printStu[n][100];
char stuName[n][100], stuSym[n][n][100];        

scanf("%d", &n); //Scan in n number of times u or q will run

for(i = 0; i < n; i++) { //initialize all symptoms to be null for later if statement.
    for(k = 0; k < n; k++) {
        strcpy (stuSym[k][i], "");
    }
}

for(i = 0; i < n; i++) {
    strcpy(nameTemp, "");
    scanf("%c", &choiceUQ);
    if(choiceUQ == 'u') { 
        flag = 0; //set flag to 0, will be changed if name is already in database.
        scanf("%s", nameTemp);
        for(k = 0; k < i; k++) { //for loop checks if name is already in database.
            if(nameTemp == stuName[k]) { 
                flag = 1; //sets flag if name is in database.
                for(m = 0; m < i; m++) { //checks for next available string array spot for symptoms.
                    if(stuSym[m][k] == "")
                       scanf("%s", stuSym[m][k]);
                }
            }
        }
        if(flag == 0) { //checks for set flag, if no flag is set, it is a new name, so symptom spot will always be 0.
           strcpy(stuName[i], nameTemp);
           scanf("%s", stuSym[0][i]);
        }
}
    if(choiceUQ == 'q') {
        scanf("%s", choiceSS); //checks for input student or symptom, and executes code related to it.
        if(choiceSS == "student") {
            scanf("%s", nameTemp);
            for(k = 0; k < i; k++) { //searches for student name in database
                if(nameTemp == stuName[k]) 
                    key = k;
            }
            for(m = 0; m < i; m++) {
                printf("%s\n", stuSym[m][key]); //prints all symptoms that student has reported
            }
        }
        if(choiceSS == "symptom") {
            count = 0; //initialize count of symptoms at 0
            scanf("%s", nameTemp);
            for(k = 0; k < i; k++) {
                for(m = 0; m < i; m++) {
                   if(nameTemp == stuSym[m][k]) { //nested for loops lead to if loop to check if each student has the given symptom
                      strcpy(printStu[count], stuName[k]);
                      count++;
                    }
                }
            }
            for(p = 0; p < count; p++) { //prints all students copied into printStu array
                printf("%s", printStu[p]);
            }
        }
    }      
}

return 0;

我在 valgrind 中遇到的错误如下所示

==4540== error calling PR_SET_PTRACER, vgdb might block

==4540== Use of uninitialised value of size 8
==4540==    at 0x108B9C: main (santos_pandemic2.c:12)


==4540== Use of uninitialised value of size 8
==4540==    at 0x4EB7EC0: __isoc99_scanf (isoc99_scanf.c:27)

^[[A

==4540== Conditional jump or move depends on uninitialised value(s)
==4540==    at 0x108C20: main (santos_pandemic2.c:14)

==4540== Conditional jump or move depends on uninitialised value(s)
==4540==    at 0x109115: main (santos_pandemic2.c:20)

==4540== HEAP SUMMARY:
==4540==     in use at exit: 0 bytes in 0 blocks
==4540==   total heap usage: 1 allocs, 1 frees, 4,096 bytes allocated

==4540== All heap blocks were freed -- no leaks are possible

最佳答案

char nameTemp[100], printStu[n][100];
char stuName[n][100], stuSym[n][n][100];

您使用未初始化的值 n 来声明这些数组。 C 不够聪明,无法弄清楚它应该在您使用 scanf 给 n 赋值后声明数组。

由于您希望动态分配这些数组(使用从 scanf 获得的值),我建议使用 malloc 为它们分配内存。或者查看“可变长度数组”以及如何使它们工作。

关于c - 解码这些 Valgrind 调试器内存错误在我的代码中意味着什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58065267/

相关文章:

arrays - Typescript:未捕获类型错误,无法读取未定义的属性 "push"

c - 使用 getc() 顺序读取文本文件并使用 fwrite() 写入 bin 文件无法按预期工作?

c - Win32 IO 性能问题

java - 你如何找到一个数组在另一个数组中重复了多少次?

javascript - 如何轻松获取 Javascript for 循环的当前迭代属性?

c++ - 内存管理的 C++ 单例

c - `MEM_RESERVE` 的 `VirtualAlloc()` 标志今天真的有用吗?

c - fflush() 在悬挂指针方面做了什么?

c - 用户空间程序如何在 free() 之后将内存传回给内核?

javascript - 比较 2 个不同电子表格中的 2 个数组,并将其补码写入第二个电子表格