[英]Segmentation fault in 2D array unsigned char using calloc in C
[英]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.