我读了大量的tutos和片段,但我仍然不明白为什么我会因此而遇到一个段错误:
int fun(char **p) {
int i;
*p = malloc(2);
*p[0]=10;
*p[1]=20; // segfault NULL pointer
printf("fun()/n");
for (i=0; i<2; i++)
printf("%d ",*p[i]);
}
int main(int argc, const char *argv[])
{
char* buffer;
int i;
fun(&buffer);
printf("main()\n");
for (i=0; i<2; i++)
printf("%d ",buffer[i]);
return 0;
}
在gdb中,它给出了:
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x0000000000000000
0x0000000100000dea in fun (p=0x7fff5fbffab0) at test.c:10
10 *p[1]=20;
(gdb) p *p[0]
$1 = 10 '\n'
(gdb) p *p[1]
Cannot access memory at address 0x0
(gdb)
我看过很多类似的片段,但肯定有一些我非常误解。
答案 0 :(得分:4)
你的意思是(*p)[1]
。你所说的是*(p[1])
。
答案 1 :(得分:0)
尝试在LHS返回变量的相同数据类型的地址。 malloc()默认返回void值。 p =(char )malloc(2); 这样编译器知道将指针移动到获取新变量的字节数。