2010-04-30 64 views
2

我有一個文本文件,其中第一個數字定義了數組的大小。我知道callocmalloc可以保留內存,但是如何?C - Malloc或calloc ...以及如何?

驗證碼:

typedef struct alpha { 
    int* size; 
    char name; 
    int tot; 
    char line[60]; 
} ALPHA; 

fgets(line, 60, fp); 
tot = atoi(line); 
size = (int*)calloc(name, sizeof(int); 

試想一下,在文本的第一行是10號,這個代號的規模將是10?像名字[10]?

回答

0
ALPHA *alphas1 = calloc(tot, sizeof(*alphas1)); 
ALPHA *alphas2 = malloc(tot * sizeof(*alphas2)); 

是一個稍微好一點的版本:

ALPHA* alphas1 = calloc(tot, sizeof(ALPHA)); 
ALPHA* alphas2 = malloc(tot * sizeof(ALPHA)); 

現在您可以訪問alphas1等, 「陣列狀」:

alphas1[0], alphas1[1], alphas1[2], ..., alphas1[tot] 
alphas2[0], alphas2[1], alphas2[2], ..., alphas2[tot] 

alphas1[...]的類型是ALPHA
alphas2[...]類型爲ALPHA。注意:爲了讓您的代碼更加可靠,請不要忘記檢查malloc/calloc是否失敗。要驗證(在你的情況下),檢查alphas1alphas2是否與NULL不同。如果它們是NULL,您將無法按照提示訪問它們,並且應該設計一種機制來從中恢復,或者退出程序(+錯誤消息)。

3

使用下列之一:

ALPHA* alphas1 = calloc(tot, sizeof(ALPHA)); 
// or 
ALPHA* alphas2 = malloc(tot * sizeof(ALPHA)); 

那些你ALPHA結構tot分配內存。

+0

您可能需要將返回值轉換爲(ALPHA *)以避免編譯器警告。 – Tyler 2010-04-30 14:25:59

+2

這個問題被標記爲C.我會被一個C編譯器惱怒,它給了我一個警告。 – Secure 2010-04-30 14:33:12

+3

@Tyler,轉換malloc()/ calloc()的返回值的唯一原因是與C++兼容。 – 2010-04-30 14:33:14

1

您可能只是想

ALPHA alphas [tot];

+0

我認爲他的任務需要使用動態分配。 – 2010-04-30 14:36:13

+1

更不用說那應該是'結構alpha alphas [tot];'或'ALPHA alphas [tot];'。 – 2010-04-30 14:44:21

+0

是我的壞 - 更改爲ALPHA 此外,這是動態分配 - 只是堆棧而不是堆,就像如果我使用了alloca – 2010-05-01 06:12:05

3

你的代碼有幾個問題。

首先,你似乎混淆了什麼樣的數據類型與實際變量的聲明。你聲明一個struct,從那開始它就是一個數據類型,很像intdouble。在給任何東西分配任何東西之前,你需要有一個東西。您可以通過在功能(ALPHA a;)中定義一個或通過爲malloc()calloc()分配一個存儲器來獲得一個。

要使用calloc(),你有兩個參數,一個是你想要多少個凡是,另一個是什麼大小。對於malloc(),您將兩者相乘。另一個區別是malloc()會返回內存中的任何內容,而calloc()會將所有內容初始化爲零。 (根據標準,這是零長度字符串或整數零,其他值不能保證,但對於大多數現代系統,您將得到相當於零的值)。這些函數返回指向已分配內存的指針。

你似乎想totint S,SO(使用calloc()),正確的說法是一樣的東西int * a = calloc(tot, sizeof(int));,或int * a = calloc(tot, sizeof(*a));。C中不需要強制轉換(在C++中是必需的,但通常不會在C++中使用malloc()calloc()),它唯一能做的就是掩蓋一個可能的錯誤(不包括#include <stdlib.h>)。

一旦你有了,你可以參考int s如a[3]

並將結果在ALPHA的領域是可行的,但你真的需要一個ALPHA,所以像

ALPHA a; 
a.size = calloc(tot, sizeof(*a)); 

會工作。例如,您會將其稱爲a.size[3]

另外,我沒有看到name正在做什麼。這是一個字符,對於任何非空字符串都是不夠的,我不知道你爲什麼在calloc()調用中得到它。您可能希望name是動態分配的字符串,其中size是其大小。在這種情況下,你需要改變線的ALPHA聲明是

int size; 
char * name; 

和代碼可能會是

ALPHA a; 
fgets(line, 60, fp); 
a.size = atoi(line); 
a.name = calloc(a.size, sizeof(*a.name)); 

一旦你做到了這一點,在進入10後,你可以參考a.name[0]a.name[9],這就是你的十個字符。 a.name[10]將是最後一個。請注意,只能在十個字符的數組中放置一個九個字符的字符串,因爲您需要爲空終止符(即任何C風格字符串的最後一個字符)留出空間。如果您希望能夠輸入指定數量的字符,則在輸入用戶輸入的號碼後,您需要將1加到a.size