分割错误(核心转储)和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;
}
能否为什么这个错误是发生有人向我解释,我怎样才能提高我的代码?
此行似乎是主要问题:
(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)
。
该参数将是函数返回时压缩后的实际输出大小,因此它是“输出”参数。 –
@JoachimPileborg它既是输入又是输出。我纠正了我的答案。 –
变化:
istream = "istream"
要
strcpy(istream,"istream");
另外,你是怎么想到strlen(ostream)
回? 120?
strlen
返回输入字符串中遇到的前0个字符的索引。
就你而言,ostream
指向的内存内容是未知的(即“垃圾”)。
strlen
将扫描此内存,直到遇到0字符,但可能会超过120字节的内存空间并导致内存访问冲突。
如果这是您的意图,请将strlen(ostream)
更改为120。
试过这个和sprintf(istream,“istream”),仍然给分段错误。 – FalconD
内存分配也是必需的。 –
那么,假设在调用'compress'时发生segfault异常,为什么不将这个函数作为问题的一部分发布? –
首先你要istream
指向内存你分配:
char *istream = malloc(10)
然后你把它指向一个文本(因此常数和只读)字符串:
istream = "istream";
你需要将拷贝到分配的内存中,否则你将不再拥有你分配的原始指针并且有内存泄漏。您也将无法使用free
那个指针,因为istream
指向的是您没有用malloc
分配的东西。
至于碰撞,请参阅David Heffernan的答案。
作为一个侧面说明,没有在你的代码中没有C++中,只有纯洁和平淡C.
为什么'C++'标签在那里? –