gpt4 book ai didi

c - 尝试使用 malloc 创建多个小型多维数组

转载 作者:行者123 更新时间:2023-11-30 16:10:15 26 4
gpt4 key购买 nike

我正在尝试使用函数从结构中分配两个多维数组。分配第一个数组工作正常,但第二个数组失败,即使两个数组的代码完全相同

我以为这是因为我没有足够的内存,但我有 16GB 的 RAM,这甚至不需要 1 KB。

如果它可以帮助我使用 CLion 和 C98。我还尝试在没有 CLion 的情况下启动导出的程序,以防它来自 CLion。

ma​​in.c

#include <stdio.h>
#include <stdlib.h>

#include <math.h>
#include <string.h>

#include "include/calc.h"

int main(int argc, char **argv)
{
calc calcObject = InitCalcObject();
}

calc.h

typedef struct CalculationObjectElement {
int ** braketArray; // <--- First array, correct allocation
int braketCount;
int braketHighestPriority;

int ** squareBraketArray; // <--- Second array, fails
int squareBraketCount;
} CalculationObjectElement, *calc;

calc InitCalcObject();

calc.c

#include <stdio.h>
#include <stdlib.h>

#include <math.h>
#include <string.h>

#include "include/calc.h"

calc InitCalcObject()
{
calc calcReturn = malloc(sizeof(calcReturn));

if (calcReturn == NULL) {
FailureHandler("Malloc - Calc object");
return NULL;
}

int i;

calcReturn->braketArray = malloc(sizeof(int *) * 256); // Working great
calcReturn->squareBraketArray = malloc(sizeof(int *) * 256); // Working great

for (i = 0; i < 256; i++) {
calcReturn->braketArray[i] = malloc(sizeof(int) * 2); // Working like a charm

if (calcReturn->braketArray[i] == NULL) {
FailureHandler(strcat("Malloc - Calc object - braketArray", (char *) i));
return NULL;
}

calcReturn->squareBraketArray[i] = malloc(sizeof(int) * 2); // Not working

if (calcReturn->squareBraketArray[i] == NULL) {
FailureHandler(strcat("Malloc - Calc object - squareBraketArray", (char *) i));
return NULL;
} //There wasn't this failure handler at first, added it desperately trying to solve this
}

return calcReturn;
}

当然,我正在尝试调试它并得到:

Program received signal SIGSEGV, Segmentation fault.
InitCalcObject () at F:\Codage\C\Projects\Calculator\src\calc.c:33
33 calcReturn->squareBraketArray[i] = malloc(sizeof(int) * 2);

在崩溃之前两次(0xC0000005)。

最佳答案

感谢@Yano ,我终于找到了解决方案,天哪,这太荒谬了...我发布这个答案,以便每个遇到此问题并有相同问题的人都可以解决它。

正如 Yano 在答案下的评论中所说,我没有为该结构分配所有空间,而只是分配了指向它的指针......

我不知道我是怎么犯这个错误的,也许我应该去 sleep xD

因此,如果您像我一样,使用带有指针的结构的 typedef (这意味着您的 typedef 用 *structElement 替换 structElement),您需要确保不是为结构分配指针,而是分配所有指针和变量在结构内部,这意味着结构本身。因此,如果您使用 sizeof() 执行 malloc(),请不要使用它的指针执​​行此操作(Si 您执行的 typedef)。

这是一个例子:

#include <stdio.h>
#include <stdlib.h>

// Creating the struct //
typedef struct structElement {
int Var1;
int ** TwoDimensionsArray;
float Var2;
} structElement, *pointerStructElement;
// Doing a typedef so pointerStructElement means a pointer of the structElement itself

int main(int argc, char **argv)
{
pointerStructElement structTest; // Declaring a POINTER of the struct

if (structTest = malloc(sizeof(structElement)) == NULL) {
printf("structTest couldn't be allocated.");
exit(1);
}
/*
Allocating memory for the size of the struct and NOT the pointer of the
struct, it's where I got it wrong at first
*/

printf("structTest correctly allocated !!!");

free(structTest);

return 0;
}

我真的希望我能帮助一些人,指针是很难理解的东西,你总是会犯这样的小错误。

再次感谢矢野:)

祝你有美好的一天,朱尔斯。

PS:也感谢其他人的帮助:)

关于c - 尝试使用 malloc 创建多个小型多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58923838/

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