使用calloc将内存分配给Struct变量时获取分段错误

时间:2013-10-01 07:43:32

标签: c structure dynamic-memory-allocation

我正在尝试使用calloc为结构变量分配内存但是会出现分段错误。当我尝试使用ddd进行调试时,在将第一个hashname分配给struct变量的成员时,得到该错误是正确的。这是代码。< / p>

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

static char vcd_xyz[5];
static char     vcd_xyz1[2];
char  getvariablename();
void printmyvalue(char a[]);
void passhashnamevalue(char a[]);
typedef struct Variable_struct
{
char *name;
char *hashname;
}Variable;

typedef struct Newstruct
{
Variable *Variables;
}sss;


int main()
{

 getvariablename();


}

char getvariablename()
{   
    int i,j;
    vcd_xyz[4] = '\0';
   int  count = 0;
    for(i=0;i<26;i++)
    {
        vcd_xyz[0] = 'a'+i;
       // printf("%d generated variable is   initial is  = %c \n",i,vcd_xyz[0]);

        for(j=0;j<26;j++)
        {
           vcd_xyz[1] = 'a'+j;
          // printf("%d generated variable is  = %c \n",j,vcd_xyz[1]);
         //  puts(vcd_xyz);
          for(int k = 0;k<26;k++)
          {
             vcd_xyz[2] = 'a' + k;
            // puts(vcd_xyz);
             for(int l=0;l<26;l++)
             {
               vcd_xyz[3] = 'a' +l;
                 count ++;
passhashnamevalue(vcd_xyz);
        //printmyvalue(vcd_xyz);
              // printf("%s\n",vcd_xyz);
              }
          }
        }
    }

    return vcd_xyz[4];
}

void printmyvalue(char a[])
{
printf("%s \n",a);
}

void passhashnamevalue(char a[])
{ sss *SSS;   
SSS->Variables = (Variable *) calloc(15,sizeof(Variable));
for(int i=0;i<=10;i++)
{
    SSS->Variables[i].hashname = (char*)calloc(strlen((char*)a)+1,sizeof(char));
strcpy(SSS->Variables[i].hashname,(char*)a);
printf("%s",SSS->Variables[i].hashname);
}

} 

我无法弄清楚我在哪里做错了。这段代码可能看起来有些搞砸了,但它继续my previous question

2 个答案:

答案 0 :(得分:4)

sss *SSS;   
SSS->Variables = (Variable *) calloc(15,sizeof(Variable));

SSS是一个未初始化的指针。在分配SSS->Variables之前,您需要为其分配内存。

您可以将SSS放在堆栈上

sss SSS;   
SSS.Variables = calloc(15,sizeof(Variable));

或在堆上动态分配

sss *SSS = malloc(sizeof(*SSS));
SSS->Variables = calloc(15,sizeof(Variable));

在任何一种情况下,您都需要在程序中稍后释放任何动态分配的内存。每次拨打malloc(或calloc / realloc)都必须稍后调用free

答案 1 :(得分:0)

你需要将内存分配给sss * SSS;或者你可以做一件事。

SSS; sss;这将是一个实例。现在通过访问它。运营商。 SSS.Variables。

以防它是指针;那么你需要malloc或calloc SSS内存。然后你可以使用 - &gt;运算符访问变量。

请记住,根本 - &gt;您需要先创建内存才能访问它。当你说sss SSS;这声明并定义了变量SSS。

在你完成的程序中,你需要先使用calloc或malloc分配内存。 然后你的程序不会崩溃。要捕获错误,可以在程序上运行valgrind。这样,您可以轻松地调试问题。另外,请记住始终使用-g选项进行编译以使用调试符号生成elf。您也可以使用gdb来调试此类问题。在启动应用程序之前执行ulimit -c unlimited。这将生成核心文件。您可以使用gdb调试此核心文件。只做gdb