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

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

最佳答案

您的程序调用了未定义的行为。它假定指针适合 int,这不是必需的。通常指针适用于 Unix 框而在 Windows 上失败;但如果需要进行此类转换,则应使用适当的整数类型,例如 stdint.h 中的 intptr_t。请注意,严格来说,整数在传递给 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 语言时,您不太可能需要这样做。

关于c - Linux <-> Windows 存储字符串地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26496691/

相关文章:

c++ - 多个文件的 makefile 不起作用

c - 二维数组分配和线程调用中的段错误

Windows CMD 检查变量是否只有大写字母

c# - 如何使用 WriteEvent 将事件记录为 Critical

c - 如何动态分配二维数组,为什么?

C - 动态分配的段错误

c - 如何访问 cvMat 中的数据

c - 快速排序无法处理小数?

linux - 如何杀死使用 CLONE_THREAD 产生并在内核空间的共享资源上阻塞的线程?

c++ - 可以使用SPACE而不是ENTER来接受C++中的输入吗?