#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
const char* base = "test";
int n = 4;
char** arr = malloc(n * sizeof(char*));
for (int i = 0; i < n; i++) {
char num[12];
snprintf(num, sizeof(num), "%d", i+1);
arr[i] = malloc(strlen(base) + strlen(num) + 1);
strcpy(arr[i], base);
strcat(arr[i], num);
printf("%s ", arr[i]);
}
// 釋放
for (int i = 0; i < n; i++) free(arr[i]);
free(arr);
return 0;
}
**原因**:`name[0] = argv[1];` 只是**指標賦值**,`name[0]` 指向 `argv[1]` 所在的記憶體 (通常是命令列緩衝區)。若隨後修改 `argv[1]` 指向的內容,或該緩衝區被釋放/覆寫,`name[0]` 會跟著變。**且 `printf` 顯示異常可能是因 `tx[0]` 未初始化指向隨機記憶體,恰好與 `argv[1]` 相鄰。**
char* name[10];
name[0] = strdup(argv[1]); // 分配新記憶體並複製內容
// 使用後 free(name[0]);
int main(int argc, char* argv[]) {
if (argc < 2) return 1;
char* tx[2] = { strdup("KU"), NULL };
char* name[2] = { NULL, NULL };
printf("tx[0] before: %s\n", tx[0]); // KU
name[0] = strdup(argv[1]); // 深拷貝
printf("tx[0] after: %s\n", tx[0]); // 仍為 KU
free(tx[0]); free(name[0]);
return 0;
}