gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:13:44 25 4
gpt4 key购买 nike

我在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com