【问题标题】:C language structureC语言结构
【发布时间】:2017-06-07 11:26:16
【问题描述】:

我正在学习 C 语言。谁能帮我理解以下结果:

int main()
{
  struct xx
  {
    int x;
    char name[];
  };
  struct xx *s;
  printf("%d",s->x);
  printf("%s",s->name);
   return 0;
}

输出:- 分段错误

我写了另一个代码是:

struct Foo
{
  char *pName;
};

int main()
{
  struct Foo *obj = malloc(sizeof(struct Foo));
  strcpy(obj->pName,"Your Name");
  printf("%s", obj->pName);
  return 0;
} 

输出:分段错误(核心转储);

为什么会出现分段错误?代码有什么问题? core dumped是什么意思?

【问题讨论】:

  • 这段代码不应该编译。如果是这样,你的编译器就是垃圾。
  • 我强烈建议您阅读一本关于 C 的好书。你的很多问题都会在那里解决。查看C tag's info page 获取一些书籍建议。
  • 现在检查代码;我的编译器是 gcc 我希望它不是废话。没有书解释为什么 malloc 在第二个代码中不起作用以及为什么第一个代码显示分段错误
  • @user2257769 - 你目前最大的问题仍然列在我的回答中(#3 和#5)。每当你有一个指针,在你取消引用它之前,你需要将它分配给一些有效的内存。示例 1 中的 s 没有指向任何内容,您需要为其分配一些内存。 pName 没有任何内存,因此 strcpy 失败并崩溃。此外,您更新了代码,在示例 1 中添加了 name 的新问题
  • thanx mike 我明白了,超级酷的人

标签: c


【解决方案1】:
  1. 不要在结构定义中赋值
  2. 假设您在托管环境中工作(在具有操作系统的系统上运行),main() 应该具有标准形式 (int main(void)) 并返回 int
  3. 在示例一中,您没有为指针 s 分配任何内存
  4. 在第二个示例中存在内存泄漏,您没有释放 obj 中的内存
  5. 在第二个示例中,您没有将任何内存分配给 pName 内的 struct Foo
  6. Core dump 表示出现严重问题。

【讨论】:

  • (严格来说,如果是嵌入式系统,main 不需要是 int main (void)。main() 中的 return 0 也不是强制性的,尽管它是很好的风格。)跨度>
  • @Lundin - 你能详细说明一下吗?为嵌入式系统编写的代码如何使其不必遵循 C 标准第 5.1.2.2.1 节,该节指定如何“定义 main()”?
  • 5.1.2.2.1 仅指定 main 应如何定义在托管环境中,它不适用于嵌入式(独立式)系统。 More info here.
  • @Lundin - 哦,是的,我明白你在说什么,并同意在 bare metal 环境中这不是强制性的。我误解了你,因为嵌入式系统仍然可以是托管环境。相应更新。
  • 感谢您的回复。我更改了代码位,但结果相同
【解决方案2】:

为该结构声明了一个指针,但该指针从未初始化,也从未创建任何结构。 s 指向一些随机内存空间,您尝试从中读取。

在第二种情况下,您有一个指针pName,它从未分配过内存。它还指向一个随机内存空间。您正在从字符串文字中复制字符串并写入随机内存位置。

【讨论】:

    【解决方案3】:

    在示例 1 中,您声明了一个指针,但尚未对其进行初始化。因此指针指向一个未知的位置。

    在示例 2 中,obj->pname 出于同样的原因指向内存的未知部分(未初始化),因此尝试在 strcpy 中访问它会使程序崩溃。

    你应该做的:你应该为指针分配一些内存,使它们指向属于你的内存,而不是内存的一些随机(非法?)部分

    【讨论】:

      【解决方案4】:
         #include <stdio.h> 
         #include <stdlib.h> 
         int main()
         {
           struct xx
           {
             int x;
             char name[25];  /* mention size of array */
           };
      
           struct xx *s;
           s=(struct xx *)malloc(sizeof(struct xx));   /* allocate the size for pointer variable */
           printf("Enter the value\n");
           scanf("%d",&s->x);           /*get the value */
           printf("Enter the name\n");
           scanf("%s",s->name);         
           printf("%d\n",s->x);          /*get the value */
           printf("%s\n",s->name);
           return 0;
         }
      

      【讨论】:

        【解决方案5】:

        你已经声明了指针变量,但是还没有分配内存给它 在strict xx *S;之后添加

        S=(struct xx*) malloc(sizeof(strict xx));
        

        并且还声明char name[30]的第一个大小;

        【讨论】:

          【解决方案6】:

          首先您需要分配变量 s 的大小,因为您的编译器不了解它应该分配给变量的内存大小。这就是为什么您需要将内存分配为: S=(struct xx*)malloc(sizeof(struct xx));

          【讨论】:

            【解决方案7】:

            很高兴看到有人研究 C 语言...

            好的,...在您的第一个代码中,您没有为 ss 变量分配内存,并且您正在访问它的值,因此它会生成分段错误..

            其次,,,pName 是一个字符指针..所以你不能在 strcpy() 函数中使用它...

            【讨论】:

              【解决方案8】:

              struct中的指针在使用时没有初始化(称为野指针)。即使指针已经初始化,它也应该指向一个有效的内存区域。

              学习C语言,内存操作是重中之重。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2012-01-19
                • 2015-06-07
                • 2018-06-19
                • 2019-05-02
                • 2021-12-05
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多