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

关于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]一次即可

【热门文章】
【热门文章】