Linux< - > Windows存储字符串的地址

时间:2014-10-21 21:29:14

标签: c linux windows gcc

我在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上运行时,我得到了 分段错误或未经授权访问内存。

1 个答案:

答案 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开始时,你不太可能需要这样做。