gpt4 book ai didi

c - union char * 和 asprintf

转载 作者:太空宇宙 更新时间:2023-11-04 00:37:33 32 4
gpt4 key购买 nike

我正在尝试学习 C 并希望使用 union。它在我正在寻找的教程中看起来很简单,虽然没有使用 char * 但我不认为它会有所作为。

下面是我的 union 是如何声明的:

union MyData
{
char * targetNumber;
int callResult;
} myData;

下面是我的主要功能,它使用我的 union 并尝试存储然后从 union 中读取

int main(int argc, char** argv) 
{

union MyData myData;

asprintf(&myData.targetNumber, "My Target Number");
myData.callResult = 1;

printf("Target Number: %s\n", myData.targetNumber);
printf("Call Result: %i\n", myData.callResult);

return (EXIT_SUCCESS);
}

当我将它放入 gdb 时,它看起来像 asprintf 工作,但是当设置 callResult 时,targetNumber 变得越界,所以当我尝试 printf 它时,它出现了段错误。我试过使用 strdup 而不是 asprintf,但并不愉快。

最佳答案

我认为您混淆了 unionstruct 之间的区别。如果你想将 targetNumbercallResult 组合在一个结构中,你可以这样做:

struct MyData
{
char * targetNumber;
int callResult;
} myData;

那么您的代码应该可以工作了。

当您将 MyData 定义为 union 时,您基本上是在创建一个可以用作 targetNumbercallResult< 的类型,但不能同时使用,因为它们在内存中占用相同的空间。

假设 sizeof(union MyData) == sizeof(targetNumber) == sizeof(int) == 4,那么当您声明 myData 时,myData 将被初始化为零 (0x00000000)。

union MyData myData; // 0x00000000

由于 myData 被清零,myData.targetNumber 也将被清零,这也是 NULL 指针。 asprintf() 将分配一个新字符串并填充其内容,然后将其分配给 myData.targetNumber。调用后,myData.targetNumber 将指向内存中的某个位置(比如 0x12345678)。

asprintf(&myData.targetNumber, "My Target Number");

现在您将 myData.callResult 重写为 1 (0x00000001)。由于 myData 是一个 union ,这导致 myData.callResult == myData.targentNumber == 1。您只是丢失了指向已分配字符串的指针,因为 myData.targetNumber 不再是 0x12345678 而是 0x00000001

myData.callResult = 1;

这就是导致您的段错误的原因。由于 myData.targetNumber == 0x000000010x00000001 不是有效指针(至少不是指向字符串的有效指针),这可能会以段错误结束。

printf("Target Number: %s\n", myData.targetNumber);

如果您到达此处,myData.callResult 将正常打印。

printf("Call Result: %i\n", myData.callResult);

关于c - union char * 和 asprintf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25428816/

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