gpt4 book ai didi

c - 传递 C 字符数组并分配导致程序崩溃

转载 作者:可可西里 更新时间:2023-11-01 11:13:35 26 4
gpt4 key购买 nike

我不知道错误是什么,因为这是在 Windows 上发生的,我不知道如何在 Windows 上逐步执行程序。关于为什么程序在这里崩溃的任何想法(见评论行)?我认为这可能与内存滥用有关。

#define TABLE_MAX_ROW       500
#define TABLE_MAX_COL 20
#define TABLE_MAX_ELT_LEN 60

从这里开始:

foo()
{
char table[TABLE_MAX_ROW][TABLE_MAX_COL][TABLE_MAX_ELT_LEN];

bar(table);
}

传递给这个函数:

bar(char table[TABLE_MAX_ROW][TABLE_MAX_COL][TABLE_MAX_ELT_LEN])
{
unsigned int col, row;

if (table == NULL) { // crashes here
printf("error: table == NULL!\n");
return -1;
}

for (row = 0; row < TABLE_MAX_ROW; row++)
for (col = 0; col < TABLE_MAX_COL; col++)
table[row][col][0] = '\0'; // if above if block commented out, crashes here

return 0;
}

最佳答案

正如所写,bar 中的 NULL 检查是不必要的,因为 table 不是在 foo 中动态分配的。

话虽如此,您可能使用该数组定义 (60 Kb) 超出堆栈帧大小,这会导致 bar 中出现运行时问题,从而导致崩溃。

尝试动态分配数组如下:

void foo (void) // explicitly type all functions
{
/**
* Declare a *pointer* to a 2D array of col x len and
* allocate rows elements of it:
*/
char (*table)[TABLE_MAX_COL][TABLE_ELT_LEN] =
malloc(sizeof *table * TABLE_MAX_ROW);

if (table)
{
bar(table);
}

free(table);
}

int bar(char (*table)[TABLE_MAX_COL][TABLE_ELT_LEN])
{
unsigned int row, col;

/**
* Some duplication of effort here, since we made the null check
* in foo, but what the heck.
*/
if (!table)
{
// handle error as above
return -1;
}

// process table as above
return 0;
}

关于c - 传递 C 字符数组并分配导致程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11959094/

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