gpt4 book ai didi

c - 二维数组段错误上的指针

转载 作者:太空宇宙 更新时间:2023-11-04 07:51:33 24 4
gpt4 key购买 nike

我有以下最小示例,其中我的主函数调用两个不同的函数 function1()function2()。他们都想在一个表上工作,该表需要在第一次运行 function1() 时生成。在我的实际程序中,该表要大得多,这就是为什么我不希望它作为全局变量硬编码在程序内存中,而是在第一轮代码中计算。我将表声明为静态的,以便在函数离开时保留分配的值。我不确定 tblPtr 是否也需要是 static。为什么我会在这里出现 SEGFAULT?

#include <stdio.h>

static void genTbl(unsigned int encodeTbl[][2])
{
int nn,mm;
for (nn=0; nn < 3;nn++){
for (mm=0; mm < 2; mm++){
encodeTbl[nn][mm] = nn+mm; //some example
}
}
}
unsigned int **tblPtr; //pointer to table
static unsigned int function1()
{
static int t1=0;
static unsigned int tbl[3][2];
if(t1==0){ //only gen table in first round
t1++;
genTbl(tbl);
tblPtr = &tbl; //assign pointer
t1++;
}
return (tbl[2][2]);
}
static unsigned int function2()
{
//also wants to work with tbl
return (tblPtr[2][2]); //SEGFAULT
}

int main()
{
int cnt=0;
while(cnt<5){
int f1 = function1();
printf("function1 return: %d\n", f1);
int f2 = function2();
printf("function1 return: %d\n", f2);
cnt++;
}
}

最佳答案

在你的function1() , 你已经调用了 undefined behaviour .

您已经定义了类似static unsigned int tbl[3][2]; 的数组,因此有效访问权限为 tbl[i][j]; , 其中0<i<30<j<2 .因此,在代码中

return (tbl[2][2]);

正在越界使用内存,它是 off-by-one .您在 function2() 中也有同样的问题还有。

也就是说,声明

 tblPtr = &tbl; 

无效,违反约束。任何启用了适当警告的编译器都会警告您有关该语句的信息。您需要更改 tblPtr 的类型成为指向 2 int 数组的指针s,像

 unsigned int (*tblPtr)[2];  

然后,分配将有效。

关于c - 二维数组段错误上的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53522907/

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