【问题标题】:Issue with C double pointer allocationC 双指针分配问题
【发布时间】:2012-11-15 17:05:51
【问题描述】:

我阅读了大量的 tutos 和 sn-ps,但我仍然不明白为什么会出现段错误:

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)

我见过很多类似的sn-ps,但肯定有一些我深深的误解。

【问题讨论】:

  • 当有人从“大量的 tutos 和 sn-ps”中学习时,我感到奇怪的警惕......
  • 您应该检查您的malloc 呼叫是否有错误。
  • @KerrekSB:非常有趣。你是谁,你碰巧认识吗?
  • @phocean:嗯,对于初学者来说,我在野外看到了很多“tutos and sn-ps”,以及类似的问题;此外,我对 C++ 的复杂性有所了解,并且想知道如果拼出“教程”已经对注意力造成负担,是否可以解决它...... :-)(但请查看我们推荐的书单!)
  • @KerrekSB 这是一个 C 问题,并不是说 C 是一种可以从不同的 Internet 资源中学习的好语言。

标签: c pointers segmentation-fault


【解决方案1】:

你的意思是(*p)[1]。你说的是*(p[1])

【讨论】:

  • 就是这样。但很遗憾阅读您的其他评论。你不尊重我不知道。从 C 语言开始,不理解某事并提出问题的罪行在哪里?我花了几天时间解决一个糟糕的语法问题。所以呢?还是谢谢。
  • @phocean:嘿,没有冒犯,祝你好运!如果您愿意,请花一些时间在 SO 上,我相信这将是一次有益的体验。您很快就会自己回答问题。
【解决方案2】:

尝试在 LHS 处返回相同数据类型的变量的地址。 malloc() 默认返回一个 void 值。 p = (char) malloc(2); 这样编译器就知道它需要移动多少字节来获取新变量。

【讨论】:

  • 这个问题很久以前就被回答和接受了。为什么要添加另一个?
  • 这个答案需要在它变得可怕和无益之前得到修复。函数malloc() 不返回void 并且转换为char 的结果malloc() 很糟糕。您的意思可能是void*char*,然后它仍然是一个坏主意:stackoverflow.com/a/605858/139746。即便如此,这也不能回答问题。
猜你喜欢
  • 2014-05-13
  • 1970-01-01
  • 1970-01-01
  • 2013-03-02
  • 1970-01-01
  • 2016-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多