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

标签 c arrays malloc

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

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/

相关文章:

C: 由于某种原因使用 fgets() 接收一个字符似乎将一个不相关的整数变量设置为 0

c - 将堆栈变量传递给 pthread_cleanup_push

c++ - 数组 : convert index of one dimensional array to a vector index of a multidimensional array

arrays - GNU-make 检查元素是否存在于列表/数组中

c - 指向结构的指针的 ANSI C 内存分配抛出非致命运行时错误

c - 使用宏WIN32或_MSC_VER跨平台

c++ - SQL Server 从扩展存储过程捕获错误

arrays - 如何创建一个与 numpy 数组重叠 50% 的滑动窗口?

token 方法的 C 段故障 : Possible malloc error?

c - 使用结构类型数组进行结构黑客