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()
^^^