C 如何在函数(即三重指针)中重新定位字符串数组
我有以下功能:C 如何在函数(即三重指针)中重新定位字符串数组,c,string,dynamic-memory-allocation,realloc,C,String,Dynamic Memory Allocation,Realloc,我有以下功能: void split(const char *string,const char *delimeter,size_t *splitArraySize,char ***splitArray); 它接收一个名为splitArray的三重指针,因为它必须重新分配字符串数组(一个char**) 在函数内部,我将重新分配为: ++(*splitArraySize); *splitArray=realloc(*splitArray,*splitArraySize*sizeof(char*)
void split(const char *string,const char *delimeter,size_t *splitArraySize,char ***splitArray);
它接收一个名为splitArray
的三重指针,因为它必须重新分配字符串数组(一个char**
)
在函数内部,我将重新分配为:
++(*splitArraySize);
*splitArray=realloc(*splitArray,*splitArraySize*sizeof(char*));
for(size_t b=0;b<*splitArraySize;b++){
(*splitArray)[b]=realloc((*splitArray)[b],4096*sizeof(char));
}
在那一行。以增加字符串数组的大小。请尝试创建一个显示。当然,还可以使用调试器捕捉这些问题,并准确定位它们在代码中发生的位置,并检查所有相关变量的值。使用
realloc()
增长数组后,分配的任何其他元素都将被取消初始化。因此,for-循环的中的最后一个realloc()
会得到一个无效指针。循环中的realloc
调用对于(*splitArray)[*splitArraySize-1]
中的最后一个和新创建的元素之外的所有元素都是无用的,您需要对其进行malloc
调用,不是realloc
。另一种方法是将函数中的void split(…)
更改为char**split(…)
和realloc,将realloc的指针返回给调用者进行赋值。这就消除了三星级程序员的问题。(但在某些情况下,做一名三星级程序员是你所能做的一切)
AddressSanitizer:DEADLYSIGNAL
=================================================================
==1728==ERROR: AddressSanitizer: SEGV on unknown address 0x000000000000