我正在尝试使用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
答案 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