簡體   English   中英

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);
}    

無符號字符為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);
}

看來您的程序是用C而不是C ++編寫的。 在C ++中,應使用運算符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()
^^^

您也可以返回指針,而不是將其傳遞給函數。

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()。 不要那樣做 main()在C和C ++中應該返回什么?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM