0

我正在尝试使用 calloc 将内存分配给 struct 变量,但出现分段错误。当我尝试使用 ddd 进行调试时,在将第一个 hashname 分配给 struct 变量的成员时出现错误。这里是代码。

#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);
}

} 

我无法弄清楚我在哪里做错了。这段代码可能看起来有点乱,但它延续了我之前的问题

4

2 回答 2

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

于 2013-10-01T07:45:40.853 回答
0

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

ssssss; 这将是一个例子。现在通过 . 操作员。SSS.变量。

万一,它是指针;那么你需要 malloc 或 calloc 的 SSS 内存。然后您可以使用 -> 运算符来访问变量。

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

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

于 2013-10-01T08:35:32.047 回答