第一次使用Malloc,程序崩溃

0 c malloc

该计划旨在接收'n'个学生及其名字并对其进行排序(没有进入排序部分).我无法弄清楚为什么我的程序在测试时崩溃了.这是代码:

#include<stdio.h>
#include <stdlib.h>
#define MaxNameLen 100
int main() {

    int n;
    scanf("%d", &n);
    char *names;
    char **pointerToNames = (char **) malloc(n * sizeof(char));
    if (pointerToNames == NULL)
        return 0;

    int i;

    for (i = 0; i <= n; i++) {
        names = (char *) malloc(MaxNameLen);
        gets(names);
        pointerToNames[i] = names;
    }

    for (i = 0; i < n; i++) {
        free(pointerToNames[i]);
        free(names);
    }
}
Run Code Online (Sandbox Code Playgroud)

Som*_*ude 5

你有三个问题.第一个是你没有为"数组"分配足够的条目:

malloc(n * sizeof(char))
Run Code Online (Sandbox Code Playgroud)

应该

malloc(n * sizeof(char*))
Run Code Online (Sandbox Code Playgroud)

第二个问题是阅读循环:

for (i = 0; i <= n; i++) {
Run Code Online (Sandbox Code Playgroud)

在这里,循环条件将导致您循环一次到多次,导致您写入超出您分配的内容(如果您解决了第一个问题).循环中的条件应该i < n类似于下一个循环.

第三个问题是你在循环中重复释放最后一个字符串

for (i = 0; i < n; i++) {
    free(pointerToNames[i]);
    free(names);
}
Run Code Online (Sandbox Code Playgroud)

当你分配namespointerToNames[i]在上述循环,当循环完成names将指向你读的最后一个字符串,所以namespointerToNames[n - 1]将指向相同的字符串.


另外两个问题包括你没有释放pointerToNames你第一次分配的实际内存.并且您不应该使用gets它(它已经被弃用,甚至在最新标准中被删除).使用fgets(或gets_s)代替.

另外,不要投回报malloc.