首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C語言指針與字符串進階:動態分配、遍歷與常見陷阱

     編輯:關於C

動態分配字符串緩衝區

使用 malloc 分配堆記憶體可實現運行時長度可變的字符串。關鍵步驟:分配空間、檢查空指標、寫入資料、正確釋放。

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

int main(void) {
    char *ptr1 = malloc(27 * sizeof(char)); // 26 字母 + '\0'
    if (ptr1 == NULL) {
        puts("記憶體分配失敗!\n");
        return 1;
    }
    ptr1[26] = '\0'; // 手動添加結束符

    char *p = ptr1;
    for (char ch = 'A'; ch <= 'Z'; ch++) {
        *p++ = ch;
    }

    printf("ptr1 內容: %s\n", ptr1);
    puts(ptr1); // puts 自動換行

    free(ptr1); // 必須釋放
    system("pause");
    return 0;
}

執行結果

字符串字面量 vs 動態分配

字符串字面量(如 "hello")存儲在唯讀數據段,指標指向它時不可修改內容;動態分配的緩衝區則可讀寫。

char *msg1 = "I am mini";          // 唯讀,指向字面量
char *msg2 = malloc(20);            // 可讀寫堆區
strcpy(msg2, "I am mini");          // 安全複製
msg2[0] = 'H';                      // 合法修改
// msg1[0] = 'H';                   // 未定義行為!崩潰風險
free(msg2);

多類型動態分配範例

malloc 返回 void*,需強制轉型。以下示範 int、float、單字符的分配:

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

int main(void) {
    char *str = malloc(100);
    int *numbers = malloc(50 * sizeof(int));
    float *floats = malloc(10 * sizeof(float));
    char *single = malloc(1);
    *single = 'x';

    if (!str || !numbers || !floats || !single) {
        puts("分配失敗");
        exit(1);
    }
    printf("分配完成!\n");
    free(str); free(numbers); free(floats); free(single);
    system("pause");
    return 0;
}

執行結果

核心觀念總結

  1. 指標 ≠ 字符串:指標僅存放位址,字符串是連續字節且以 \0 結尾。
  2. malloc 必配 free:避免記憶體洩漏,釋放後指標置 NULL 防野指標。
  3. 字面量唯讀:char *s = "abc"; s[0]='x'; 會導致段錯誤。
  4. 緩衝區大小:分配時預留結束符空間,strlen(s) + 1。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved