top/contents search

7. 内存分配

7.1 为什么这段代码不起作用?

	char *answer;
	printf("Type something:\n");
	gets(answer);
	printf("You typed \"%s\"\n", answer);

7.2 我无法获取strcat工作。我试过

	char *s1 = "Hello, ";
	char *s2 = "world!";
	char *s3 = strcat(s1, s2);
但我得到了奇怪的结果。

7.3 但是手册页显示strcat说它接受两个char *作为参数。我应该如何知道分配内存?

7.3b 我刚试了这段代码

char *p;
strcpy(p, "abc");
它居然能运行。怎么回事?为什么没有崩溃?

7.3c 指针变量分配多少内存?

7.4 我正在用这段代码从文件中读取行到数组中

	char linebuf[80];
	char *lines[100];
	int i;

	for(i = 0; i < 100; i++) {
		char *p = fgets(linebuf, 80, fp);
		if(p == NULL) break;
		lines[i] = p;
	}
为什么所有行最终都包含最后一行副本?

7.5a 我有一个函数本应返回一个字符串,但是当它返回给调用者时,返回的字符串是乱码。

7.5b 那么返回字符串或其他聚合体的正确方法是什么?

7.6 为什么我对调用malloc?

7.7 为什么有些代码仔细地转换了malloc返回的值转换为正在分配的指针类型?

7.7b 转换malloc的返回值有什么问题?

7.7c 在调用malloc时,像“无法将 `void *' 转换为 `int *''' 这样的错误是什么意思?

7.8 我看到类似这样的代码

	char *p = malloc(strlen(s) + 1);
	strcpy(p, s);
难道不应该是malloc((strlen(s) + 1) * sizeof(char))?

7.9 我写了一个小的包装函数围绕着malloc,但它不工作

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

	mymalloc(void *retp, size_t size)
	{
		retp = malloc(size);
		if(retp == NULL) {
			fprintf(stderr, "out of memory\n");
			exit(EXIT_FAILURE);
		}
	}

7.10 我正在尝试声明一个指针并为其分配一些空间,但是它不起作用。这段代码有什么问题?

char *p;
*p = malloc(10);

7.10a 这个初始化有什么问题?

char *p = malloc(10);
我的编译器抱怨“无效的初始化列表”或类似的消息。

7.10b 如何关闭那个“警告:可能的指针对齐问题”的消息,这是lint在每次调用malloc?

7.11 如何动态分配数组?

7.12 如何得知有多少可用内存?

7.13 应该应该做什么?返回一个空指针还是指向 0 字节的指针?

7.14 我听说有些操作系统实际上并不分配malloc分配的内存,直到程序试图使用它。这合法吗?

7.15 malloc返回了奇怪的指针值,但我确实读了问题 7.6,并且我包含了这一行

	extern void *malloc();
在我调用它之前。

7.16 我正在为一些数值工作分配一个大数组,使用了这行代码

	double *array = malloc(300 * 300 * sizeof(double));
malloc没有返回 null,但程序行为异常,就好像它覆盖了内存,或者malloc没有分配我要求的那么多,或者诸如此类的。

7.17 我的 PC 有 8MB 内存。为什么我似乎只能malloc640K 左右?

7.18 我的应用程序高度依赖于数据结构的节点动态分配,并且malloc/free的开销正成为瓶颈。我该怎么办?

7.19 我的程序正在崩溃,似乎在某个地方向下进入malloc内部,但我看不出有什么不对。是malloc?

7.19b

我正在动态分配一个数组,像这样

	int *iarray = (int *)malloc(nints);
malloc没有返回 NULL,但代码不起作用。

7.20 你不能在使用已释放的动态分配内存,对吧?

7.21 为什么调用free?
释放指针后使用(赋值、比较)指针值有多不安全?

7.22 当我调用malloc为一个函数中的局部指针分配内存时,我是否必须显式地free它?

7.23 我正在分配包含指向其他动态分配对象的指针的结构。当我释放一个结构时,是否也必须释放每个附属指针?

7.24 在程序退出前我必须释放分配的内存吗?

7.25 我有一个程序,它malloc了很多内存,之后又free了很多内存,但从操作系统上看,内存使用量并没有真正减少。

7.26 知道需要释放多少字节?free如何知道需要释放多少字节?

7.27 那么我能否查询 malloc 包以了解已分配块的大小?

7.28 为什么sizeof能否告诉我一个指针指向的内存块的大小?

7.29 动态分配了一个数组(如问题 6.14 中所述)后,我能改变它的大小吗?

7.30 将 null 指针作为第一个参数传递给realloc是否合法?为什么会有人这样做?

7.31 之间的区别是什么?callocmalloc?我应该使用哪个?利用calloc的零填充是否安全?free是否适用于用calloc分配的内存,还是需要cfree?

7.32 是什么?alloca为什么不推荐使用它?


回到顶部

contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管