关于c语言函数malloc 的一些问题。

这是网上对malloc函数讲解的一个例子
63d0f703918fa0ec5e3984b9229759ee3c6ddb8c.jpg

    #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

回到顶部