2017-07-27 345 views
0

我正在使用一個char指針數組。由於strlen_sse2()的分段錯誤

#define MAXFIELDS 100 
#define MAX_LENGTH 245 

char *dex_data[MAXFIELDS]; //declared globally. 

我在這麼多的函數中使用了這個dex_data數組。我在這樣的主函數中分配內存

dex_data = malloc(sizeof(char *)*MAXFIELDS); 

int p; 

for(p=0; p < MAXFIELDS ; p++) 
    dex_data[p] = malloc(sizeof(char)*MAX_LENGTH); 

每次都得到分段錯誤。我試圖通過GDB檢查錯誤。它說

#0 0x00007fb0a91b2b71 in __strlen_sse2() from /lib64/libc.so.6 

我是否錯誤地分配內存,或者我是否嘗試分配更大的內存? 我不知道原因。任何人都可以幫忙嗎?提前致謝。

+1

請在出現錯誤的位置顯示代碼。有一個很好的機會,你有一個字符串缺少''\ 0'',你忘了分配一些東西(這裏你分配100個指針的空間,但只分配20個字符串),或者你已經覆蓋了一個指針所以它隨機指向某個地方。 –

+0

您目前顯示的內存分配代碼看起來沒問題。有點奇怪,你只是爲硬編碼的20個'dex_data'分配指針,而不是爲'(p = 0; p lurker

+0

我在strlen()的strcmp()中的很多地方都使用了這個dex_data [],但是沒有做任何其他的事情。無論如何你的一個例子。 if(strlen(dex_data [6])> 0){free_qty = atoi(dex_data [6]); } else { free_qty = 0; } – Nani

回答

0

此:

char *dex_data[MAXFIELDS]; 

是已經具有MAXFIELDS量的堆棧上char*指針的數組。這是不可轉讓的。但是,這裏:

dex_data = malloc(sizeof(char *)*MAXFIELDS); 

您正試圖分配給它。這是未定義的行爲。

只需刪除該行。您不需要(也不允許)爲dex_data分配內存。

旁註:分配給數組類型至少會給你一個編譯警告。看來你使用的是一個非常老的編譯器,你應該升級。

+0

我刪除了你說的那一行,仍然是分段錯誤。我在putty上使用gcc(GCC)4.8.5 20150623(Red Hat 4.8.5-11)版本。我沒有得到任何警告。但是我得到了和以前一樣的錯誤「__strlen_sse2()from /lib64/libc.so.6」。 – Nani

+0

@Nani然後,其他東西導致段錯誤。刪除違規行後,您發佈的代碼完全正常。 –

+0

除了這個dex_data之外,程序無處不在。我不知道是哪個導致了錯誤。我是否爲這個dex_data緩衝區使用了更大的內存? – Nani

相關問題