我无法弄清楚我从中得到分段错误似乎是什么问题:
#include <stdio.h>
#include <stdlib.h>
#include <cstring>
void alloc(unsigned char *data) {
data = (unsigned char *) malloc(20);
memset(data, 0, 20);
}
void main() {
unsigned char *data = NULL;
int i;
alloc(data);
for (i = 0; i < 20; i++) {
data[i] = i;
printf("%d ", *(data + i));
}
free(data);
}
无符号字符是1个字节,因此循环20应该是正确的
答案 0 :(得分:7)
void alloc(unsigned char *data) {
data = (unsigned char *) malloc(20);
memset(data, 0, 20);
}
修改指针的本地副本。您可以通过引用传递它以使您的示例工作:
void alloc(unsigned char *&data) {
data = (unsigned char *) malloc(20);
memset(data, 0, 20);
}
答案 1 :(得分:0)
您也可以返回指针,而不是将其传递给函数。
unsigned char *alloc() {
unsigned char *data = (unsigned char *) malloc(20);
memset(data, 0, 20);
return data;
}
然后,
...
unsigned char *data = alloc();
int i;
...
您标记了C ++,但您的代码看起来像C.如果您真的想编写C ++,那么您不应该使用malloc。使用new []或适当的智能指针。
编辑:您正在使用void main()。不要这样做。 What should main() return in C and C++?
答案 2 :(得分:0)
您的程序似乎是用C语言而不是C ++编写的。在C ++中,您应该使用operator new []而不是malloc。
该函数的问题是函数参数是其局部变量。所以函数参数char *data
是在main中声明的参数的副本,如
unsigned char *data = NULL;
因此函数alloc
中参数的任何更改都不会影响原始参数。退出函数后,参数(局部变量)将被销毁,main中的原始变量将不会被更改。
你有两种方法。您可以通过以下方式声明函数
void alloc(unsigned char **data) {
*data = (unsigned char *) malloc( 20 );
if ( *data ) memset( *data, 0, 20 );
}
并将其称为
alloc( &data );
或者您按以下方式声明该功能
unsigned char * alloc() {
unsigned char *data = (unsigned char *) malloc( 20 );
if ( data ) memset( data, 0, 20 );
return data;
}
并在主要内容中调用
data = alloc();
考虑到函数main应该用C表示,如
int main( void )
^^^
和C ++一样
int main()
^^^