堆栈上的char数组导致seg错误

时间:2015-07-14 20:43:55

标签: c arrays malloc

这可能是预期的,但我只是对如何/为何发生这种情况感到好奇。

当我尝试使用char *声明的本地char * foo = "\xFF\xFF..."作为整数时,它会出错。但是,如果我使用malloc,当我尝试访问它时,它可以很好地工作。为什么会这样?

#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <inttypes.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
  unsigned char *buf = malloc(16);
  memcpy(buf, "\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 16);
  //unsigned char *buf = "\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"; // seg faults if you sue this instead

  uint64_t *k  = (uint64_t *) buf;
  uint64_t *k2 = (uint64_t *) (buf + 8);
  uint64_t i  = 1000000000;

  printf("-k =%" PRIu64 "\n", *k);
  printf("-k2=%" PRIu64 "\n", *k2);

  printf("Iter * %" PRIu64  "\n", i);
  for (uint64_t c = 0; c < i; ++c)
    {
      *k  += 1;
      *k2 -= 1;
    }

  printf("-k =%" PRIu64 "\n", *k);
  printf("-k2=%" PRIu64 "\n", *k2);

  return 0;

}

输出:

easytiger $ gcc -std=c99 tar.c -Wall -O2 ; time ./a.out
-k =0
-k2=18446744073709551615
Iter * 1000000000
-k =1000000000
-k2=18446744072709551615

3 个答案:

答案 0 :(得分:5)

字符串文字是不可变的。您可能无法修改存储在那里的数据。如初。

现在即使在C语言中,我们也可以通过将const转换为指针类型来使其清晰可辨。

C ++实际上需要它。

答案 1 :(得分:3)

无法保证字符串文字将存储在可写内存页中。这意味着for循环中的*k += 1操作可能会尝试写入只读内存。另一方面,由malloc分配的内存将始终可写。

答案 2 :(得分:3)

有关此表格的定义:

unsigned char *buf = "some string";

buf指向存储在内存的只读部分中的静态字符串。当你尝试写入它时,你会得到一个段错误。

使用mallocbuf指向的内存是可写的。