从 C 中的函数返回二维数组



我正在尝试从函数返回一个 2d 数组,但由于某种原因,当我在我的 main 中调用该函数时,它会导致分段错误。

char **upper_case_word(char **word,int size){
int i =0;
int i2=0;
// this gets the number of words
int length = upper_counter(word,size);
//this gets the size of the largest word
int size2 = length_upper(word,size);
char ** upper =malloc(length*sizeof(char*));
for(i =0; i <length; i++){
upper[i]= malloc(size2*sizeof(char*));
}
i =0;
for(i =0; i<=size2; i++){
for(i2 =0; i2<(sizeof(word[i])/sizeof(word[i][0])); i2++){   
if(isupper(word[i][i2])!=0){     
upper[i]=word[i];
}
}
}
return upper;
}
int main(){
//this is causing the segmentation fault.
char ** upper = upper_case_word(words,size);
return(0);
}

我不确定这涵盖了所有问题,但这里有一些问题可以开始:

您分配的不是 2D 数组。相反,您分配一个指针数组,并为每个指针分配一个数组。最后一个数组应该是字符数组。但是,您的代码是:

upper[i]= malloc(size2*sizeof(char*));
^^^^^
Should be char, not char*

但这不是 seg 错误的原因 - 它只是分配了比需要的更多的内存。

外部阵列,即upper使用以下length进行分配:

char ** upper =malloc(length*sizeof(char*));
^^^^^^

但稍后您使用size2迭代它 - 在这里:

for(i =0; i<=size2; i++){

因此,如果size2大于或等于length,您可以越界访问。这可能会导致赛格错误。

那么这部分:

sizeof(word[i])/sizeof(word[i][0])

你确定这是在做你想做的事吗?

它与:

sizeof(char*)/sizeof(char)

或者只是

sizeof(char*)

我怀疑这就是你想要的。

然后你有这个代码:

if(isupper(word[i][i2])!=0){     
upper[i]=word[i];
}

在这里,您可以更改upper[i]持有的指针值。这是没有意义的,这是一个内存泄漏,因为您用另一个指针覆盖了指向动态分配内存的指针。

相关内容

  • 没有找到相关文章