gpt4 book ai didi

对 getChar 和 printf 的调用似乎修改了不相关的数据

转载 作者:行者123 更新时间:2023-11-30 18:12:42 25 4
gpt4 key购买 nike

我编写了一个分配和初始化二维数组的函数,如下所示 -

static state **symbols;

void initNFAStates()
{
int i,j;
numStates = 256;
symbols = (state**)malloc(numStates * sizeof(char));
for(i = 0;i < numStates;i++)
{
symbols[i] = (state*)malloc(NUMSYMBOLS * sizeof(state));
for(j = 0;j < NUMSYMBOLS;j++)
symbols[i][j] = 0;
}
}

和一个打印这个数组的函数,就像这样 -

void printNFAStateTable()
{
int i, j;
for(i = 0;i < numStates;i++)
{
printf("%d \t",i);
for(j = 0;j < NUMSYMBOLS;j++)
printf("%ld",symbols[i][j]);
printf("\n");
}
}

当从 main() 函数连续调用时,它们都工作正常。但是,以下代码在仅读取数组的前 32 行后会导致段错误。

int main(int argc, char **argv)
{
int i;
clock_t begin, end;
double timeTaken;
currNFAState = 0;
initNFAStates();


if(getChars(argc,argv) != NULL)
{
printNFAStateTable();
begin = clock();
regex();
...

类似地,printf() 函数也会导致相同的问题,但仅在打印 float 时 -

int main(int argc, char **argv)
{
int i;
clock_t begin, end;
double timeTaken;
currNFAState = 0;
initNFAStates();
printf("A floating point number - %f",0.0124f);
printNFAStateTable();
...

我知道这与 symbols 数组是静态的有关,因为当数组是全局时,问题不会出现。谁能解释为什么会发生这种情况?

最佳答案

鉴于此声明:

static state **symbols;

此分配不正确:

symbols = (state**)malloc(numStates * sizeof(char));

*symbols的类型为state *;这是您动态分配的数组元素的类型,我有信心断言您机器上的指针比 char 更大。这将是一个更合适的分配:

symbols = malloc(numStates * sizeof(*symbols));

(请注意,您不需要转换 malloc() 的返回值,并且有充分的理由不这样做。)

由于没有为您要使用的所有指针分配足够的内存,因此当您的程序尝试访问超出分配范围的索引处的元素时,它会表现出未定义的行为。该 UB 很容易以库函数的形式出现,修改您不希望它们修改的内存。

关于对 getChar 和 printf 的调用似乎修改了不相关的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32571034/

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