关于c语言函数malloc 的一些问题。
这是网上对malloc函数讲解的一个例子
#include <stdio.h> /* printf, scanf, NULL */#include <stdlib.h> /* malloc, free, rand, system */
int main (){
int i,n;
char * buffer;
printf ("输入字符串的长度:");
scanf ("%d", &i);
buffer = (char*)malloc(i+1); // 字符串最后包含 \0
if(buffer==NULL) exit(1); // 判断是否分配成功
// 随机生成字符串
for(n=0; n<i; n++){
buffer[n] = rand()%26+'a';
buffer[i]='\0';
}
printf ("随机生成的字符串为:%s\n",buffer);
free(buffer); // 释放内存空间
system("pause");
return 0;
}
问题1:malloc【返回值】分配成功返回指向该内存的地址,失败则返回 NULL。但是 为什么我没有办法将buffer打印出来?
问题2:6行 为什么要定义成char * buffer,而不能定义为char buffer?
问题3:14行 既然定义的是char * buffer, 为什么可以用buffer[]?那不就成数组了么?双方可以互换是么?
回答:
1) 正解,malloc失败就返回NULL, 第10行不是有判断,如果分配失败程序就退出了吗
2)char *buffer表示buffer的数据类型是char *,意思是一个指向char的指针,而char buffer表示buffer的类型是char,一个是指针,一个非指针,怎么会一样呢
3)buffer[i]表示*(buffer+i)
,也就是对buffer偏移i个字节后取指针所指向的空间的char值,并不是说只有数组才能有"[]"操作,指针也可以有这个操作,前提你需要保证不越位。
其实对于指针或数据操作来说,A[i]等价于*(A+i), 注意,这里还有一个更少见的但是绝对正确的写法,就是i[A],因为"[]"的含义就是 *()
include <stdio.h>
int main(){
const char *hello = "abcd";
printf("%c\n", hello[2]);
printf("%c\n", *(hello+2));
printf("%c\n", 2[hello]); //看这个写法,是不是很少见?但绝对正确
return 0;
}
回答:
数组取值其实也是使用指针的,所以问题三中你的说法是正确的,但是具体操作中还有一个数组边界问题,不能越界操作,否则报错。
动态申请数组之后最好是先初始化一下,有库函数可以用。
题主代码中有一段可以改一下
for(n=0; n<i; n++){ buffer[n] = rand()%26+'a';
//buffer[i]='\0';这句应该放在循环外
}
更改后如下
for(n=0; n<i; n++){ buffer[n] = rand()%26+'a';
}
buffer[i]='\0';
只需要最后将\0
赋与buffer[i]
一次即可
以上是 关于c语言函数malloc 的一些问题。 的全部内容, 来源链接: utcz.com/p/195391.html