C 重新分配**阵列

C 重新分配**阵列,c,arrays,malloc,realloc,C,Arrays,Malloc,Realloc,正在创建我的2d数组字符**缓冲区。malloc部分工作正常。realloc部分正在生成分段错误 这两个功能执行以下操作: //sets up the array initially void setBuffer(){ buffer = (char**)malloc(sizeof(char*)*buf_x); for(int x=0;x<buf_x;x++){ buffer[x] = (char *)malloc(sizeof(char)*buf_y); } if(buffer

正在创建我的2d数组字符**缓冲区。malloc部分工作正常。realloc部分正在生成分段错误

这两个功能执行以下操作:

//sets up the array initially
void setBuffer(){
buffer = (char**)malloc(sizeof(char*)*buf_x);

for(int x=0;x<buf_x;x++){
    buffer[x] = (char *)malloc(sizeof(char)*buf_y);
}

if(buffer==NULL){
    perror("\nError: Failed to allocate memory");
}
}

//changes size
//variable buf_x has been modified
void adjustBuffer(){
for(int x=prev_x; x<buf_x;x++) {
    buffer[x] = NULL;
}

buffer=(char**)realloc(buffer,sizeof(char*)*buf_x);

for(int x=0; x<buf_x;x++){
    buffer[x]  = (char*)realloc(buffer[x],sizeof(char)*buf_y);
    strcpy(buffer[x],output_buffer[x]);
}
if(buffer == NULL){
    perror("\nError: Failed to adjust memory");
}
}
//初始设置数组
void setBuffer(){
缓冲区=(char**)malloc(sizeof(char*)*buf_x);

对于(intx=0;x我想
buf_x
是全局的。
您需要存储原始大小并将其传递给函数。
如果添加了元素,则需要将新元素设置为NULL,这样
realloc
将成功

//variable buf_x has been modified
void adjustBuffer( int original){
    buffer=realloc(buffer,sizeof(char*)*buf_x);
    for(int x=original; x<buf_x;x++){
        buffer[x] = NULL;//set new pointers to NULL
    }
    for(int x=0; x<buf_x;x++){
        buffer[x]  = realloc(buffer[x],sizeof(char)*buf_y);
    }
}
//变量buf_x已被修改
无效调整缓冲区(整型原件){
buffer=realloc(buffer,sizeof(char*)*buf_x);

对于(int x=original;xbut如何更改缓冲区的大小,同时不删除其中的元素?还是应该将元素保存在数组中,然后将它们放回重新分配的数组中?谢谢you@xing我已经修改了代码。你能检查一下我是否听从了你的建议吗?谢谢你这是锯齿形数组,不是2D array!完全不同的数据类型!@xing那么我应该在函数adjustBuffer的开头设置buffer[0]=NULL吗?谢谢。很抱歉。但是它仍然给我一个分段错误
//variable buf_x has been modified
void adjustBuffer( int original){
    if ( ( buffer = realloc ( buffer, sizeof(char*) * buf_x)) != NULL) {
        for ( int x = original; x < buf_x; x++) {
            buffer[x] = NULL;//set new pointers to NULL
        }
        for ( int x = 0; x < buf_x; x++){
            if ( ( buffer[x] = realloc ( buffer[x], strlen ( output_buffer[x]) + 1)) == NULL) {
                break;
            }
            strcpy(buffer[x],output_buffer[x]);
        }
    }
}