《你必须知道的495个C语言问题》笔记
第7章 内存分配
7.1 为什么以下代码不行?
char *answer;
printf(“Type somrthing:\n”);
gets(answer);
printf(“You typed “%s”\n”, answer);
a:指着answer未初始化,他可能指向任何位置或者为空指针。
7.2 以下代码:
char *s1 = “hello,”;
char *s2 = “world!”;
char *s3 = strcat(s1, s2);
a:没有为结果分配空间,解决办法:把s1声明为足够大小的数组。
7.5 一个指针变量分配多少内存?
a:实际上,这样声明时char *p;只分配的足够容纳指针本身的内存,即分配了sizeof(char *)个字节的内存,还未分配任何让指针指向的内存。
7.6 如下代码将文件的所有行读入一个数组:
char linebuf[80];
char *lines[100];
int i;
for(i = 0; i<100;i++){
char *p = fget(linebuf, 80, fp);
if(p == NULL) break;
lines[i] = p;
}
a:实际上只分配了一行的内存:linebuf。每次调用fgets的时候,前一行的内容都被覆盖了。解决办法:为每一行都分配内存。
7.7 如下代码:
#include<stdio.h>
char itoa(int n){
char retbuf[20];
sprintf(retbuf, “%d”, n);
return retbuf;
}
在函数返回的时候,它的自动局部变量都会被抛弃。所以此处返回的指针是无效的,因为它指向一个已经不存在的数组。解决办法:1.给retbuf加static修饰;2.将retbuf作为函数形参;3.使用指针,使用malloc给retbuf分配空间。
7.8 返回的指针必须是静态分配的缓冲区或调用者传入的缓冲区或malloc()获得的内存,但不能是局部数组。
7.14 如下分配有什么问题:
char *p;
*p = malloc(10);
a:给指针p分配空间应该用:p=malloc(10)。