2013-10-01 46 views
0

我正在嘗試使用calloc爲結構變量分配內存,但出現分段錯誤。當我嘗試使用ddd進行調試時,在將第一個哈希名分配給代碼是結構變量的成員。使用calloc將內存分配給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); 
} 

} 

我無法揣摩出我做mistake.This代碼看起來好像有點搞砸了,但其在延續my previous question

+2

林不是一個挑剔,但「passhashnamevalue」會看起來好多了,因爲「PassHashNameValue」 – TsSkTo

回答

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

+0

這對我來說很成功,確實是一個來自新程序員的愚蠢的錯誤。所有我試着用這個代碼是在結構中存儲不同的'hashname',但是所有這些代碼都是在打印每個hashame 10次,所以我刪除了for循環並且放置了Variables [0],然後爲這個循環放了一個for循環。 = 0; i <= 10; i ++) printf(「%s \ n」,SSS-> Variables [i] .hashname); ' }'但它只打印第一個值,然後再次出現seg錯誤。 – shailendra

+0

如果你只爲'Variables [0]'設置了一個字符串,那麼'Variables [1]'將會是'NULL',從而導致段錯誤'SSS->變量[1] .hashname'將取消引用NULL。您只能從已設置內容的字符串打印值。 – simonc

+0

這就是我在將'Variables [j]'保存在循環中而不是'Variables [0]'時所做的事情。意味着生成「n」結構並將hashname的值傳遞給其成員散列名 – shailendra

0

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

sss SSS;這將是一個實例。現在通過訪問它。運營商。 SSS.Variables。

如果是指針,那麼你需要malloc或calloc SSS內存。然後你可以使用 - >運算符來訪問變量。

請記住,基本 - >您需要先創建內存,才能訪問它。當你說sss SSS;這聲明和定義了變量SSS。

在完成的程序中,您需要先使用calloc或malloc分配內存。 然後你的程序不會崩潰。爲了抓住你的錯誤,你可以運行valgrind到程序中。這樣,您可以輕鬆調試問題。另外,請記住始終使用-g選項編譯以生成帶有調試符號的精靈。你也可以使用gdb來調試這些問題。在啓動應用程序之前,請執行ulimit -c unlimited。這將生成核心文件。你可以用gdb調試這個corefile。只是做gdb