使用指针的2D数组

时间:2010-10-12 10:07:07

标签: c pointers dynamic multidimensional-array 2d

我试图以“ADAM”,“MARK”,“JESSIE”格式读取一些随机名称的文件......

我有一些约束,文件应该在函数中读取,但是应该可以从主函数访问而没有全局变量。 文件大小和文件中的名称不知道。 这是我到目前为止所做的。我对动态二维数组有些困难,因为我没有太多使用它们。

/* Function to read from the file */
int read_names(FILE *input, char ***names, int *name_count)
{
    int f1,size,count,i,j=0;
    char **name_array,*text,pos=0;
    /* get the file size */
    f1=open("names.txt",O_RDONLY);
    size=lseek(f1,0,SEEK_END);
    close(f1);
    /* Reading all the characters of the file into memory */
    //Since file size is known we can use block transfer
    text=(char *) malloc(size * sizeof(char) );
    fscanf(input,"%s",text);

    /* Finding the no of names in the file */
    for(i=0;i<size;i++)
    {
        if(text[i]==',')
            count++;
    }
    printf("No. of names determined\n");

    /* Assigning the Name count to the pointer */
    name_count=(int*)malloc(sizeof(int));
    *name_count=count;


    name_array=(char **) malloc(count * sizeof(char *));
    for(i=0;i<count;i++)
    {
        name_array[i]=(char*) malloc(10 *sizeof(char ));
    }
    for(i=0;i<size;i++)
    {
        if(text[i]!='"')
            if(text[i]==',')
            {
                **name_array[pos][j]='\0'; //error here
                pos++;
                j=0;
            }
            else
                name_array[pos][j++]=text[i];
    }
    printf("Names Counted\n");
    printf("Total no of names: %d\n",*name_count);
    names=(char ***) malloc(sizeof(char **);
    names=&name_array;
    return 1;
}

/* Main Function */
int main(int argc, char *argv[])
{
    FILE *fp;
    char ***names;
    int *name_count;
    int status;
    // Opening the file
    fp = fopen("names.txt","r");
    // Now read from file
    status = read_names(fp,names,name_count);
    printf("From Main\n");
    fclose(fp);
    system("PAUSE");
    return 0;
}

我使用WxDev并在尝试分配空字符时收到错误“`unary *'的无效类型参数。

有关如何执行此操作的任何指示?

3 个答案:

答案 0 :(得分:1)

从生成错误的行中仔细查看此表达式,并考虑它正在做什么:

**name_array[pos][j]

记住方括号的precedence高于一元*,这相当于*(*((name_array[pos])[j])),即2个下标,后跟2个解引用。这是总共4个解除引用,因为foo[i]相当于*(foo+i)。声明的name_array类型为char **,这意味着您只能取消引用它两次。将类型声明char **name_array视为**name_array具有类型char的含义,因为这是类型声明语法的基础(请参阅History of C,“胚胎C”)。 / p>

非主题

另一个问题就出现了:

name_array[i]=(char*) malloc(sizeof(char ));

在这里,您只为name_array的每个元素中的单个字符分配足够的空间。

答案 1 :(得分:0)

            **name_array[pos][j]='\0'; \\error here

我看到name_array被声明为

char **name_array

问题在于

**name_array[pos][j]尝试取消引用(两次!!)一个角色

**   (name_array[pos]) [j];    /* name_array[pos] is of type (char*) */
** ( (name_array[pos]) [j] );  /* name_array[pos][j] is of type (char) */

你不能取消引用一个角色。

建议:简化您的代码。
当代码没有“行为”时,通常不是因为它太简单了;)

答案 2 :(得分:-1)

这可能看起来很迂腐,但这很重要。您没有使用2D阵列。实际上,您不会在代码中创建 ANY 数组。

要理解的一个重要事项是数组“衰减”成指针。

link text

  

C中关于数组和指针的大部分混淆可以追溯到对这个语句的误解。假设数组和指针是equivalent'' means neither that they are identical nor even interchangeable. What it means is that array and pointer arithmetic is defined such that a pointer can be conveniently used to access an array or to simulate an array. In other words, as Wayne Throop has put it, it's指针算术和数组索引[那]在C中是等价的,指针和数组是不同的。'')