2014-01-16 79 views
2

我對使用Linux和在C上創建任何遠程嚴重的問題都很新穎。我一直在試圖創建一個程序,它將簡單地壓縮單個字符串,但我一直在獲取該分割嘗試運行編譯的文件時出錯。 我用它編譯:分割錯誤(核心轉儲)和zlib

gcc 2.c -o test.o -lz 

我的代碼:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <zlib.h> 
#include <assert.h> 
int main() 
{ 
char *istream = malloc(10), *ostream = malloc(120); 
istream = "istream"; 
int res = compress(ostream, (uLongf *)strlen(ostream), istream,(ulong)strlen(istream)); 
return 0; 
} 

能否爲什麼這個錯誤是發生有人向我解釋,我怎樣才能提高我的代碼?

+0

爲什麼'C++'標籤在那裏? –

回答

2

此行似乎是主要問題:

(uLongf*)strlen(ostream) 

你是將一個size_t值解釋爲指向緩衝區的指針。您打算傳遞包含輸出緩衝區長度的unsigned long的地址。再看看compress的文檔。

最重要的是,你還不知道C字符串是如何工作的。賦值運算符與char*左值一起使用時僅複製地址而不是字符串的內容。我建議你宣佈你的緩衝區這樣的:

const char *istream = "istream"; 
char ostream[120]; 

我覺得你的程序應該是沿着這些路線的東西:

int main(void) 
{ 
    const char *istream = "istream"; 
    char ostream[120]; 
    uLongf destLen = sizeof(ostream); 
    int res = compress((Bytef*)ostream, &destLen, (Bytef*)istream, strlen(istream)); 
    return 0; 
} 

注意,我寫的代碼假設您使用的是C編譯器。因此int main(void)

+0

該參數將是函數返回時壓縮後的實際輸出大小,因此它是「輸出」參數。 –

+1

@JoachimPileborg它既是輸入又是輸出。我糾正了我的答案。 –

1

變化:

istream = "istream" 

strcpy(istream,"istream"); 

另外,你是怎麼想到strlen(ostream)回? 120?

strlen返回輸入字符串中遇到的前0個字符的索引。

就你而言,ostream指向的內存內容是未知的(即「垃圾」)。

strlen將掃描此內存,直到遇到0字符,但可能會超過120字節的內存空間並導致內存訪問衝突。

如果這是您的意圖,請將strlen(ostream)更改爲120。

+0

試過這個和sprintf(istream,「istream」),仍然給分段錯誤。 – FalconD

+0

內存分配也是必需的。 –

+0

那麼,假設在調用'compress'時發生segfault異常,爲什麼不將這個函數作爲問題的一部分發布? –

2

首先你要istream指向內存你分配:

char *istream = malloc(10) 

然後你把它指向一個文本(因此常數和只讀)字符串:

istream = "istream"; 

你需要拷貝到分配的內存中,否則你將不再擁有你分配的原始指針並且有內存泄漏。您也將無法使用free那個指針,因爲istream指向的是您沒有用malloc分配的東西。

至於碰撞,請參閱David Heffernan的答案。


作爲一個側面說明,沒有在你的代碼中沒有C++中,只有純潔和平淡C.