【问题标题】:p->data = (int*)malloc(sizeof(int)); compare to (int*)p->data = (int*)malloc(sizeof(int));p->data = (int*)malloc(sizeof(int));比较 (int*)p->data = (int*)malloc(sizeof(int));
【发布时间】:2010-08-26 00:26:45
【问题描述】:
typedef struct _DListNode
{
    struct _DListNode* prev;
    struct _DListNode* next;
    void*  data;
}DListNode;

在 gcc 中:

DListNode *p = NULL;

p = (DListNode*)malloc(sizeof(DListNode));

p->data = (int*)malloc(sizeof(int));   

scanf("%d", (int*)p->data);

正确编译。

在 gcc 中:

DListNode *p = NULL;

p = (DListNode*)malloc(sizeof(DListNode));

(int*)p->data = (int*)malloc(sizeof(int)); 

scanf("%d", (int*)p->data);

有问题:

(int*)p->data = (int*)malloc(sizeof(int)); -------error: lvalue required as left operand of assignment.

区别:

scanf("%d", (int*)p->data) ,

(int*)p->data = (int*)malloc(sizeof(int)),

p->data = (int*)malloc(sizeof(int));

【问题讨论】:

  • 无论哪种情况,您都不应该从 malloc 转换 - 从 void* 转换是隐含在 C 中的。
  • 更不用说,data 的类型是 void*,所以从 malloc 转换纯属无稽之谈。
  • 注意:以下划线和大写字母开头的标识符是保留的。所以从技术上讲,上面的内容是无效的:'_DListNode'

标签: c gcc malloc


【解决方案1】:

语句之间的区别在于,尝试在表达式左侧指定指针类型是没有意义的,这就是您在 (int*)p->data 情况下所做的,因为 p->data始终是结构中定义的void*。当编译器看到这一点时,它假定您将其转换为 int* 以便您可以读取它,即它变成一个 r 值,该值仅在赋值表达式的右侧有效,而不是一个可以赋值的左值(左侧)。

如果您想读取/写入存储在 p->data 中的整数值,那么我认为最清晰的语法是 *((int*)(p->data)) - 即获取 p->data 指针,将其转换为 int* 然后取消引用 - 但是我敢肯定,由于优先规则,您可能会丢失一些括号。

data 是一个空指针;它不在乎您在其中存储了什么,即您在 malloc 上的 (int*) 强制转换实际上是浪费了;它只关心你是否给它分配了一些内存。

【讨论】:

  • 感谢大家回答我的问题。 “(int*)p->data case 因为 p->data 始终是结构中定义的 void*”,我只是徘徊,如果我想将 int 值存储到一个单元中,我必须使用“scanf( "%d", (int*)p->data) ", 使用 (int ) 来指定.so, 为什么不需要使用 (int) 来指定或告诉 "p- >data",嘿,你存储的是一个int*的指针值。
【解决方案2】:

是否有充分的理由在struct _DListNode 中使用void* 而不是int*?如果没有,请将其更改为 int*,然后您就不需要 任何 演员表了。一开始就让类型正确总是比在你的代码中撒上强制转换要好。

您遇到的错误是因为您根本无法在作业的左侧进行强制转换。这是违反规则的。您需要了解lvalues and rvalues 是什么以及它们之间的区别。

【讨论】:

    【解决方案3】:

    (int*&)p->data = (int*)malloc(sizeof(int));"怎么样?

    (int *) 给出指针值本身,即类似于说0x12345678 = malloc(sizeof(int));

    顺便说一句,为像 int 这样小的东西分配内存是非常浪费的。

    编辑:

    1. 这可能仅适用于 C++,不适用于 C。

    2. 你为什么要先投射?您正在将 void 指针分配给 void 指针。那不是很方便吗?为什么要投射?

    3. 如果你真的想自娱自乐,你可以做一些傻事,比如*(int **) &(p->data) = (int *) malloc(sizeof(int));。废话,对吧?对。只需分配值。更好的是,用联合替换您的数据。

    【讨论】:

    • 它在 C++ 中工作,我的 C 有点生疏。无论如何,我一开始就看不到投射的意义。
    • C 绝对没有引用,因此您的 (int*&) 将是语法错误。我很惊讶(int*&)p->data 是 C++ 中的左值,但我不知道那里的所有细节。
    • 是的,它基本上是对指针的引用,所以你可以修改它。同样,这整个方法一开始有点倒退。不应该有演员表,最好不应该有 malloc。
    【解决方案4】:

    type cast() 的优先级高于 ->,所以你的第一个等于 ((int*)p)-data。 我认为这不是你想要的。

    【讨论】:

      【解决方案5】:

      那么,你的问题是什么?那个“差异”部分应该是什么意思?

      到目前为止,您遇到了问题

      (int*)p->data = (int*)malloc(sizeof(int));
      

      这显然是一个无效的陈述。编译器已经告诉你原因了。

      那么,再次,您的问题是什么?

      【讨论】:

        猜你喜欢
        • 2013-02-19
        • 2021-11-22
        • 1970-01-01
        • 2014-08-13
        • 1970-01-01
        • 2021-06-09
        • 2021-05-18
        • 1970-01-01
        • 2012-06-14
        相关资源
        最近更新 更多