c ++ unsigned char数组分配 - 分段错误

时间:2015-06-08 15:05:45

标签: c segmentation-fault malloc memset unsigned-char

我无法弄清楚我从中得到分段错误似乎是什么问题:

#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应该是正确的

3 个答案:

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