c ++ unsigned char数组分配 - 分段错误
c++ unsigned char array allocation - segmentation fault
我无法弄清楚我从中得到分段错误的问题似乎是什么:
#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);
}
Unsigned char 是 1 个字节,所以循环 20 应该是正确的
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);
}
您也可以 return 指针,而不是将其传递给函数。
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++?
看来你的程序是用C而不是C++写的。在 C++ 中,您应该使用 operator new [] 而不是 malloc.
函数的问题是函数参数是它的局部变量。所以函数参数 char *data
是其在 main like
中声明的参数的 copy
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;
}
并像
一样在main中调用它
data = alloc();
考虑到函数 main 应该在 C 中像
int main( void )
^^^
在 C++ 中像
int main()
^^^
我无法弄清楚我从中得到分段错误的问题似乎是什么:
#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);
}
Unsigned char 是 1 个字节,所以循环 20 应该是正确的
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);
}
您也可以 return 指针,而不是将其传递给函数。
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++?
看来你的程序是用C而不是C++写的。在 C++ 中,您应该使用 operator new [] 而不是 malloc.
函数的问题是函数参数是它的局部变量。所以函数参数 char *data
是其在 main like
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;
}
并像
一样在main中调用它data = alloc();
考虑到函数 main 应该在 C 中像
int main( void )
^^^
在 C++ 中像
int main()
^^^