C指針案例分析

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

void read_slogan(FILE *fp, char **slogan)
{
      char buf[1024];
       int i;
      for (i = 0; i < 7; i++) {
            fgets(buf, 1024, fp);
            /*刪除換行字符*/
            buf[strlen(buf)-1] = '\0';
            /*分配保存一個標語的內存空間*/
            slogan[i] = malloc(sizeof(char) * (strlen(buf) + 1));
            /*複製標語的內容*/
            strcpy(slogan[i], buf);
       }
 }

 int main(void)
 {
       char *slogan[7];
       int i;
       read_slogan(stdin, slogan);
       /*輸出讀取的標語*/
       for (i = 0; i < 7; i++) {
              printf("%s\n", slogan[i]);
       }
       return 0;
 }

       這段代碼來自《征服C指針》第四章4.2節4.2.1小節4-5代碼清單。從網上找的電子版《征服C指針》在這一塊有些錯誤。我看的那版電子版的《征服C指針》關於read_slogan寫的是void read_slogan(FILE fp, char *slogan),這裏的形參定義讓我迷惑了好一陣。後來看了書才發現電子版的書有錯誤。本來指針對新手來說就不太好理解,看了這本有錯誤的電子版《征服C指針》搞得我更糊塗了。這裏就來分析一下void read_slogan(FILE fp, char *slogan)中char *slogan爲什麼不對。

       這段代碼是在被調用函數read_slogan中分配內存並得到內存地址,然後通過被調用函數read_slogan把這塊區域返回給主調用函數main。在被調用函數read_slogan中分配的是字符數組,要分配7個字符數組,用for循環表示的,每一次循環分配一個字符數組,並返回這個字符數組的地址。字符數組的地址是一級指針。我們要把這7個一級指針返回給主調函數main,就需要在main函數中定義7個變量,由於這7個變量存放7個一級指針,而變量的級數是由他存放的內容的級數決定的,因此在main函數中要分配7個一級指針,也就是一個有7個元素的指針數組 char *slogan[7];,數組的每一個元素存放一個一級指針。又因爲是從被調用函數中去給這個數組賦值,所以需要將這個數組 char *slogan[7]的地址傳給被調用函數read_slogan。由於數組存放的是一級指針,那麼數組的地址就是二級指針。所以read_slogan的形參應該定義爲二級指針,而不是錯誤的電子書上寫的那樣是一個一級指針形參。

       這裏的分析可以查看我的上一篇博客https://mp.csdn.net/postedit/90896587

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章