我编写了一个分配和初始化二维数组的函数,如下所示 -
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/