Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
第一次使用Malloc,程序崩溃_C_Malloc - Fatal编程技术网

第一次使用Malloc,程序崩溃

第一次使用Malloc,程序崩溃,c,malloc,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

该计划旨在接收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);
    }
}
#包括
#包括
#定义MaxNameLen 100
int main(){
int n;
scanf(“%d”和“&n”);
字符*名称;
char**pointerToNames=(char**)malloc(n*sizeof(char));
if(pointerToNames==NULL)
返回0;
int i;

对于(i=0;i您有三个问题。第一个问题是您没有为“数组”分配足够的条目:

应该是

malloc(n * sizeof(char*))
第二个问题是读取循环:

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

for(i=0;i您有三个问题。第一个问题是您没有为“数组”分配足够的条目:

应该是

malloc(n * sizeof(char*))
第二个问题是读取循环:

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

for(i=0;i您的第一个
malloc
旨在为
N
指向字符的指针分配内存,但您正在分配
N
字符,这可能是更少的内存

更改此行:

char **pointerToNames = (char **) malloc(n * sizeof(char));
为此:

char **pointerToNames = malloc(n * sizeof(*pointerToNames));
此外:

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

因此不再使用
名称
,而是使用
fgets()
。请注意,
循环从
0
N-1
,而不是
N
pointerToNames[N]
不是有效的数组元素。

您的第一个
malloc
旨在为指向字符的
N
指针分配内存,但您正在分配
N
字符,这可能是更少的内存

更改此行:

char **pointerToNames = (char **) malloc(n * sizeof(char));
为此:

char **pointerToNames = malloc(n * sizeof(*pointerToNames));
此外:

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

因此不再使用
名称
,而是使用
fgets()
。请注意,
循环从
0
N-1
,而不是
N
pointerToNames[N]
不是有效的数组元素。

@haccks@Inisheer;抱歉!
获取
现在在C中成为历史。@haccks@Inisheer;抱歉!
获取
现在在C中成为历史。