C语言结构

时间:2013-04-08 13:59:12

标签: c

我正在学习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是什么意思?

8 个答案:

答案 0 :(得分:5)

  1. 您不在结构定义中指定值
  2. 假设您在托管环境中工作(在具有操作系统的系统上运行),main()应具有标准格式(int main(void))并返回int
  3. 在示例一中,您没有为指针s
  4. 分配任何内存
  5. 你的第二个例子中有一个内存泄漏,你没有释放obj
  6. 中的内存
  7. 您没有将第二个示例中的任何内存分配到pName
  8. 中的struct Foo
  9. Core dump意味着出了问题。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分: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;
   }

答案 4 :(得分:0)

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

之后添加
S=(struct xx*) malloc(sizeof(strict xx));

并声明char name[30]的第一个尺寸;

答案 5 :(得分:0)

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

答案 6 :(得分:0)

很高兴看到有人在使用C语言......

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

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

答案 7 :(得分:0)

结构中的指针在使用时不会初始化(称为野指针)。即使指针已经初始化,它仍然指向有效的存储区域。

学习C语言时,记忆操作是最重要的。