我在Linux上编写应用程序时遇到了严重问题。 我有这个代码
#include <stdio.h>
int main()
{
char ar[10][10];
strcpy(ar[1], "asd");
strcpy(ar[2], "fgh");
int test[2];
test[1] = (int)ar[1];
printf("%s %x | %s %x\n\n", ar[1], ar[1], test[1], test[1]);
return 0;
}
它适用于Windows,但是当我想在Linux上运行时,我得到了 分段错误或未经授权访问内存。
答案 0 :(得分:3)
您的程序调用未定义的行为。它假定指针适合int
,这不是必需的。通常指针适用于Unix盒子并且在Windows上失败;但是如果需要进行此类转换,则应使用适当的整数类型,例如intptr_t
中的stdint.h
。请注意,严格来说,在传递给printf
之前,必须将整数转换回指针类型。
使用指向printf
的指针类型和足够大的整数类型可以产生正确的行为:http://ideone.com/HLExMb
#include <stdio.h>
#include <stdint.h>
int main(void)
{
char ar[10][10];
strcpy(ar[1], "asd");
strcpy(ar[2], "fgh");
intptr_t test[2];
test[1] = (intptr_t)ar[1];
printf("%s %x | %s %x\n\n", ar[1], ar[1], (char*)test[1], (char*)test[1]);
return 0;
}
请注意,将指针转换为整数类型通常不赞成,并且很可能导致程序错误。除非出于某种原因绝对需要这样做,否则不要去那里。当你从C开始时,你不太可能需要这样做。