【问题标题】:Struct pointer and its pointer attribute issue结构指针及其指针属性问题
【发布时间】:2021-09-29 02:40:05
【问题描述】:

此代码是否有未定义的行为,这意味着对于 s 是强制分配内存还是可以这样? PS:两者有什么区别

 struct X* x = (struct X*)malloc(sizeof(struct X));
      and
    struct X* x = (struct X*)malloc(sizeof(x)); 
    and 
    struct X* x = (struct X*)malloc(sizeof *x); 

谢谢。

#include <stdio.h>
#include <stdlib.h>

struct X 
{
    int x;
    char* s;
};
int main()
{  
    struct X* x = (struct X*)malloc(sizeof(struct X));
    x->x = 10;
    // x->s = (char*)malloc(10);
    // memcpy...
    x->s = "something";
    printf("is ok?");

    return 0;
}

【问题讨论】:

  • 第一个是正确的,因为它分配了正确的字节数来保存结构。另外两个只分配指针大小的内存:4 或 8 字节。你真的不需要 malloc 上的(struct X*),因为结果与所有指针类型兼容。虽然它会起作用(并且是样式问题),但声明指向结构的指针的常规方法是struct X x*

标签: c pointers malloc


【解决方案1】:

与其把我自己的解释扔给你,我觉得分享一个可以阐明你想要实现的目标的链接会更有帮助:

https://www.geeksforgeeks.org/new-vs-malloc-and-free-vs-delete-in-c/

当您创建一个指针时,我看到您已将指针添加到您的 char* 变量/结构,但在调用它们时,使用 & 符号 & 用作对内存中地址的引用。

但是当声明它不是'*'然后使用'&'引用位置时,使用int变量并没有完全正确地应用。

【讨论】:

  • 也许指针和字符串的基础知识在这里会更有用,不是吗?
  • 我也想过这个,所以很可能。
【解决方案2】:

这很好。由于sstruct 的一部分,因此为结构分配内存将为s 分配内存。我强烈建议将s 的类型更改为const 指针,因为它指向一个文字,因为它是一种常量,所以不能修改。

在这之后你不能做s[0]='n';。除了不可修改的文字 "something" 之外,您没有分配任何空间来保存任何字符串。

【讨论】:

  • 在我看来,您应该详细说明静态字符串与字符串的动态分配,因为提供的代码可能不打算处理 const 字符串。例如,解释一个 char 指针最初是一个指针,然后可以指向任何东西(程序文本部分中的静态字符串、动态分配、ROM 中的字符串地址等)。因此,将静态字符串分配给 s 很好,但意味着不应再从 s 进行字符串操作,除非静态分配旨在“分配”静态空间等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多