使用 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;
}

字符串字面量(如 "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;
}

\0 結尾。NULL 防野指標。char *s = "abc"; s[0]='x'; 會導致段錯誤。strlen(s) + 1。