0

我正在学习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;
} 

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

为什么我会遇到分段错误?代码有什么问题?核心转储是什么意思?

4

8 回答 8

5
  1. 您不会在结构定义中分配值
  2. 假设您在托管环境中工作(在具有操作系统的系统上运行),main()应该具有标准形式 ( int main(void)) 并返回一个int
  3. 在示例一中,您没有为指针分配任何内存s
  4. 您在第二个示例中存在内存泄漏,您没有释放内存obj
  5. 您没有在第二个示例中将任何内存分配给pNamewithinstruct Foo
  6. 核心转储意味着出现了非常严重的问题。
于 2013-04-08T14:03:32.857 回答
1

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

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

于 2013-04-08T14:04:02.297 回答
0

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

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

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

于 2013-04-08T14:07:48.887 回答
0
   #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;
   }
于 2014-12-02T11:45:50.853 回答
0

您已声明指针变量但尚未为其分配内存要在之后添加strict xx *S;

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

并声明第一个大小为char name[30];

于 2016-06-25T06:31:39.673 回答
0

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

于 2016-12-07T14:37:17.977 回答
0

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

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

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

于 2017-01-22T16:53:00.527 回答
0

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

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

于 2017-06-07T03:26:16.987 回答