簡體   English   中英

C中三維數組的問題

[英]Problems in three dimension array in C

我像這樣定義了三維數組,但它無法讀取其中的任何字符串? 問題出在哪里? 謝謝!

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] 顯示為空。

當您分配外部 arrays 時,您的 arguments 到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或更好的某種容器類型)或古老的 Z0D61F8370CAD1D412F80B84D14 實現(pre-19)。

您應該對 3d“數據”數組使用 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");

您指定的已分配對象的大小無效。

你必須寫

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;
}

它的 output 是

hello

在這種情況下,要釋放所有已分配的 memory,只需調用一次free

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM