gpt4 book ai didi

c - 执行 malloc 时程序崩溃

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

当我执行 *arr = malloc(i * sizeof(struct cluster_t*)); 时,我的代码总是崩溃。集群是一种结构。我不确定是什么问题。第二个输入是一个结构数组(簇)它应该将 txt 文件加载到数组中,每一行作为一个单独的结构第一个输入是一个 .txt 文件包含这个:

    count=20
40 86 663
43 747 938
47 285 973
49 548 422
52 741 541
56 44 854
57 795 59
61 267 375
62 85 874
66 125 211
68 80 770
72 277 272
74 222 444
75 28 603
79 926 463
83 603 68
86 238 650
87 149 304
89 749 190
93 944 835

这是代码中似乎有问题的部分(我在第一个答案后对其进行了一些修改)这不是完整的代码:

int load_clusters(char *filename, struct cluster_t **arr) //nefunkcne
{
assert(arr != NULL);

char buffer_load[256] = {'0'};
int riadok = 0;
int count = 0;

int *X = malloc(sizeof(int));
if (X == NULL) {
perror("Chyba mallocu na load_clusters X");
free(X);
exit(EXIT_FAILURE);
}

int *Y = malloc(sizeof(int));
if (Y == NULL) {
perror("Chyba mallocu load_clusters Y");
free(X);
free(Y);
exit(EXIT_FAILURE);
}

int *ID = malloc(sizeof(int));
if (ID == NULL) {
perror("Chyba mallocu v load_clusters ID");
free(X);
free(Y);
free(ID);
exit(EXIT_FAILURE);
}

FILE *subor = fopen(filename, "r");
if (subor == NULL) {
perror("Chyba nacitania suobru fopen load_clusters!");
}

while (fgets(buffer_load, sizeof buffer_load, subor) != NULL) {
if (riadok > 0) {
struct cluster_t shluk;
sscanf(buffer_load,"%d %d %d", ID, X, Y);
init_cluster(&shluk, 1);
struct obj_t objekt;
objekt.id = *ID;
objekt.x = *X;
objekt.y = *Y;

append_cluster(&shluk, objekt);

arr[riadok - 1] = malloc(sizeof(struct cluster_t*));
if (arr[riadok-1] == NULL) {
perror("Chyba mallocu v load_clusters 388!");
free(arr[riadok - 1]);
exit(EXIT_FAILURE);
}

(*arr)[riadok - 1] = shluk;
} else {
sscanf(buffer_load, "count=%d", &count);
*arr = malloc(count * sizeof(struct cluster_t));
if (arr == NULL) {
perror("Chyba mallocu v load_clusters 400!");
free(*arr);
exit(EXIT_FAILURE);
}
}
riadok++;
}

fclose(subor);
free(X);
free(Y);
free(ID);
return cout;
}

我保持最新的完整代码(记住使用 `-std=c99 -Wextra -Wall -Werror -DNDEBUG 和 -lm 如果在 gcc 中因为数学库): https://docs.google.com/document/d/1xoNcBpY1lkmki3-E5WUYFVg-xojjvEkUJ63XC_UzhtM/edit?usp=sharing

最佳答案

你的代码太复杂了,有问题:

  • 您不需要分配数据来将指针传递给scanf(),只需传递局部变量的地址即可。
  • 检查scanf() 的返回值:它返回成功转换的次数。如果转换失败,则不会设置相应的变量,其余转换也会失败。
  • 如果您的 txt 文件以空格开头,例如 count=20scanf 格式应该包含一个初始空间来消耗这些空间:"count=% d".
  • 指针和结构之间似乎存在很多混淆:函数应该分配簇数组还是将对象序列加载到分配的簇中?

这是一个将对象加载到单个分配的集群中的简化版本:

int load_clusters(const char *filename, struct cluster_t **arr) {
char buffer_load[256];
int riadok, count, X, Y, ID;
struct cluster_t *cp;

assert(arr != NULL);

// Open the input file
FILE *subor = fopen(filename, "r");
if (subor == NULL) {
perror("Chyba nacitania suobru fopen load_clusters!");
exit(EXIT_FAILURE);
}

// Read and parse the count line
if (fgets(buffer_load, sizeof buffer_load, subor) == NULL ||
sscanf(buffer_load, " count=%d", &count) != 1) {
perror("missing count line in file\n");
fclose(subor);
exit(EXIT_FAILURE);
}

// allocate and initialize the cluster
*arr = cp = malloc(sizeof(**arr));
if (cp == NULL) {
perror("Chyba mallocu v load_clusters 400!");
exit(EXIT_FAILURE);
}
init_cluster(cp, count);

riadok = 0;
while (riadok < count &&
fgets(buffer_load, sizeof buffer_load, subor) != NULL) {
if (sscanf(buffer_load,"%d %d %d", &ID, &X, &Y) == 3) {
struct obj_t objekt;
objekt.id = ID;
objekt.x = X;
objekt.y = Y;
append_cluster(cp, objekt);
riadok++;
}
}

fclose(subor);
return riadok;
}

关于c - 执行 malloc 时程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41088483/

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