gpt4 book ai didi

c - 第一次使用 Malloc,程序崩溃

转载 作者:太空宇宙 更新时间:2023-11-04 05:40:15 25 4
gpt4 key购买 nike

该程序旨在接收“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);
}
}

最佳答案

你有三个问题。首先是您没有为“数组”分配足够的条目:

malloc(n * sizeof(char))

应该是

malloc(n * sizeof(char*))

第二个问题是阅读循环:

for (i = 0; i <= n; i++) {

这里的循环条件会导致你循环一次到多次,导致你写的超出你分配的(如果你解决了第一个问题)。循环中的条件应该是i < n就像在下一个循环中一样。

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

for (i = 0; i < n; i++) {
free(pointerToNames[i]);
free(names);
}

当你分配 namespointerToNames[i]在上面的循环中,当该循环完成时 names将指向您读取的最后一个字符串,因此 namespointerToNames[n - 1]将指向相同的字符串。


另外两个问题包括您没有释放实际的 pointerToNames您首先分配的内存。而且你不应该使用 gets (它早已被弃用,甚至在最新标准中被删除)。使用 fgets (或 gets_s )。

此外,don't cast the return of malloc .

关于c - 第一次使用 Malloc,程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21061897/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com