在GCC中使用{0}初始化时出现奇怪的段错误

bla*_*all 1 c gcc segmentation-fault

这是代码:

char s[8];
int i = 0;
void **p = &s;
for (; i < 8; ++i) {
    putchar( ((char*)(*p))[i] );
}
Run Code Online (Sandbox Code Playgroud)

上面的代码可以工作,但给了一些垃圾字符.所以我做的只是初始化s[8]:

char s[8] = {0};
Run Code Online (Sandbox Code Playgroud)

然后分段错误,但如果我使用VC++编译并运行它,它工作正常.奇怪的.有人可以解释一下吗?谢谢!

更新:很多人说上面的代码是愚蠢的......这个更新适合你.原始代码的样子:

static void* 
copy_and_move(void **dst, int dsz, const void **src, int ssz) {
      const int sz = ssz > dsz ? dsz : ssz;      
      memcpy(*dst, *src, sz);
      return *dst + sz;
}
Run Code Online (Sandbox Code Playgroud)

然后是主叫代码:

char d[10], s[8];
copy_and_move(&d, sizeof(char) * 10, &s, sizeof(char) * 8);
Run Code Online (Sandbox Code Playgroud)

rod*_*igo 5

让我们来看看:

void **p = &s;
Run Code Online (Sandbox Code Playgroud)

在那里,p指向s,也就是说,它包含第一个字节的地址s.

它是一个指向指针的指针,因此*p被读作指针,它将使用前n个字节s,其中n等于sizeof(void*)(4或8).

然后你使用该指针*p读取内存字节...

现在,哪些字节在内存s中将被读取为内存地址?

  • 如果数组未初始化:垃圾,那么在VC++中看起来就像是指向who-know-where的真实指针.你读了一些随机字节.
  • 如果数组初始化为{0],则它们将全为零,因此*p将是NULL指针和段错误.