2010-04-30 27 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

相关问题