gpt4 book ai didi

c - 二维动态数组重新分配

转载 作者:太空宇宙 更新时间:2023-11-04 03:08:06 24 4
gpt4 key购买 nike

我对这个程序有疑问。这个想法是从文本文件中读取字符串并将它们包含在具有恒定列数和不同行数的二维动态数组中。如果初始行数不足以包含所有字符串,则必须重新分配数组的内存块。代码编译正常,但无法执行。

#include<stdio.h>
#include<stdlib.h>
#include <string.h>
#define SIZE 80
#define DELTA 5

char** include(char b[SIZE],char** p,int n,int k,int flag);
void output(char **p,int k);

int main(void)
{
char **ptr;
FILE *fp;
int i=0,koef=1;
char buffer[SIZE];

if((ptr=(char **)malloc(DELTA*sizeof(char *)))==NULL){
printf("Error!Memory not allocated!\n");
exit(1);
}
if((fp=fopen("test.txt", "r")) == NULL) {
printf("Cannot open file.\n");
exit(1);
}
do{
if(fgets(buffer,sizeof(buffer),fp)==NULL){
printf("Error while reding file!\n");
exit(1);
}
if(i<(DELTA*koef))
ptr=include(buffer,ptr,i,koef,1);
else {
koef++;
ptr=include(buffer,ptr,i,koef,2);
}
i++;
}while(!feof(fp));

free(ptr);

return 0;
}

char** include(char b[SIZE],char** p,int n,int k,int flag)
{
switch(flag){
case 1: *(p+n)=(char *)malloc(sizeof(b));
strcpy( *(p+n),b);
break;
case 2: if((p=(char **)realloc(p,k*DELTA*sizeof(char *)))==NULL){
printf("Error!Memory not allocated!\n");
exit(1);
}
*(p+n)=(char *)malloc(sizeof(b));
strcpy(*(p+n),b);
break;
}
return p;
}

void output(char **p,int k)
{
int j;
for(j=0;j<k;j++)
printf("%s\n",*(p+j));
}

最佳答案

指定数组参数的大小没有任何效果。

void func(char b[SIZE]);

相当于

void func(char *b);

因此,当你说

case 1: *(p+n)=(char *)malloc(sizeof(b));

sizeof 将评估为指向 char 的指针的大小。尝试使用

case 1: *(p+n)=(char *)malloc(SIZE * sizeof(b));

你说的地方出现同样的错误

*(p+n)=(char *)malloc(sizeof(b));

你可以改成

*(p+n)=(char *)malloc(SIZE * sizeof(b));

您应该设置大小,以便缓冲区有空间容纳整行,包括换行符和终止符\0。否则,strcpy 将无法正常工作。无论如何你应该使用 strncopy 。进行这些更改后,一旦到达文件末尾,fgets 将返回 0,并且您的程序将报告“Reding 文件时出错!”。您应该相应地更改读取循环的终止。

此外,您实际上并没有使用多维数组。您正在使用指向字符数组的指针数组。在 C 中,二维数组将分配在连续的内存块中,并按行优先顺序访问。这在您的情况下是可以的,因为所有行都应该具有相同的长度。然而,您正在尝试维护一个指针数组,这些指针又指向行。这也有效,但在技术上不是我们在 C 中所说的多维数组。它称为 Iliffe vector。或者只是一个数组的数组

总而言之,您的代码错综复杂,难以理解。您应该尝试简化您的程序,这将使您将来更容易发现错误。

关于c - 二维动态数组重新分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2213229/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com