C语言中三维数组的问题

问题描述 投票:0回答:2

我是这样定义三维数组的,但它不能读取任何字符串?问题出在哪里?谢谢!!!数据[0][0]显示为空。

int stuTotal, courseTotal,i,k;//a dynamic array
printf("Input the total number of students that you would like to import:");
scanf("%d", &stuTotal);
printf("Input the total number of courses that you would like to import:");
scanf("%d", &courseTotal);

char ***data = (char***)calloc(stuTotal,sizeof(char));//data
for(i = 0;i < stuTotal;i++){
    data[i] = (char**)calloc(courseTotal,sizeof(char));
    for (k = 0;k < courseTotal;k++){
        data[i][k] = (char*)calloc(20,sizeof(char));
    }
}
strcpy(data[0][0],"hello");

data[0][0]显示为空。

c arrays string pointers calloc
2个回答
1
投票

你的参数 sizeof 当你分配外部数组时,是不正确的--而不是用

char ***data = (char***)calloc(stuTotal,sizeof(char));

需要

char ***data = (char***)calloc(stuTotal,sizeof(char **)); // you're allocating N elements of type `char **`.

你可以将这个调用大大简化如下。

char ***data = calloc( stuTotal, sizeof *data ); // sizeof *data == sizeof (char **)

同理

data[i] = calloc( courseTotal, sizeof *data[i] ); // sizeof *data[i] == sizeof (char *)

的结果,你应该不需要投掷 malloccalloc 除非你是在C++中工作(在这种情况下,你应该使用 new 或者,更好的是,某种容器类型)或者是一个 古老 C的实现(1989年以前).你应该使用sizeof(char**)来处理三维 "数据 "数组,因为这个三维数组的每个元素都是char**。


0
投票

你应该对3d "data "数组使用sizeof(char**),因为这个3d数组的每个元素都是char**。

int stuTotal, courseTotal,i,k;//a dynamic array
printf("Input the total number of students that you would like to import:");
scanf("%d", &stuTotal);
printf("Input the total number of courses that you would like to import:");
scanf("%d", &courseTotal);

char ***data = (char***)calloc(stuTotal,sizeof(char**));//data
for(i = 0;i < stuTotal;i++){
    data[i] = (char**)calloc(courseTotal,sizeof(char*));
    for (k = 0;k < courseTotal;k++){
        data[i][k] = (char*)calloc(20,sizeof(char));
    }
}
strcpy(data[0][0],"hello");

0
投票

你指定了无效的分配对象的大小。

你必须写

char ***data = (char***)calloc(stuTotal,sizeof(char **));//data
                                               ^^^^^^^   
for(i = 0;i < stuTotal;i++){
    data[i] = (char**)calloc(courseTotal,sizeof(char *));
                                                ^^^^^^ 
    for (k = 0;k < courseTotal;k++){
        data[i][k] = (char*)calloc(20,sizeof(char));
    }
}

如果你的编译器支持可变长度的数组,那么你可以通过调用 malloccalloc 只有一次。例如

char ( *data )[courseTotal][20] = 
    malloc(  sizeof( char[stuTotal][courseTotal][20] ) );

char ( *data )[courseTotal][courceName] = 
    calloc(  1, sizeof( char[stuTotal][courseTotal][courceName] ) );

下面是一个演示程序。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) 
{
    size_t stuTotal = 5, courseTotal = 10, courceName = 20;

    char ( *data )[courseTotal][courceName] = 
        calloc(  1, sizeof( char[stuTotal][courseTotal][courceName] ) );


    strcpy(data[0][0],"hello");

    puts( data[0][0] );

    free( data );

    return 0;
}

它的输出是

hello

在这种情况下,为了释放所有分配的内存,需要调用 free 只有一次。

© www.soinside.com 2019 - 2024. All rights reserved.