【发布时间】:2015-07-14 20:43:54
【问题描述】:
这可能是意料之中的,但我只是好奇这是如何/为什么会发生的。
当我尝试使用在本地声明的 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
【问题讨论】:
-
你到底想做什么......?!?!为什么你的 C 问题被标记为c++?
-
即使字符串文字是可写的(它不是),由于对齐,代码在某些架构上可能会失败。
-
一个错误。我只是看看会发生什么。它不适用于我正在编写的任何代码。
-
只需使用
unsigned char buf[] = "\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF";...如果仅在本地需要这几个字节,则无需malloc()。