分割错误(核心转储)和zlib

问题描述:

我对使用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++'标签在那里? –

此行似乎是主要问题:

(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它既是输入又是输出。我纠正了我的答案。 –

变化:

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异常,为什么不将这个函数作为问题的一部分发布? –

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

char *istream = malloc(10) 

然后你把它指向一个文本(因此常数和只读)字符串:

istream = "istream"; 

你需要拷贝到分配的内存中,否则你将不再拥有你分配的原始指针并且有内存泄漏。您也将无法使用free那个指针,因为istream指向的是您没有用malloc分配的东西。

至于碰撞,请参阅David Heffernan的答案。


作为一个侧面说明,没有在你的代码中没有C++中,只有纯洁和平淡C.