首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言命令列參數處理:生成字串陣列與 argv 賦值陷阱

     編輯:程式設計綜合問答

需求一:生成 "test1"..."testN" 字串陣列

#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;
}

需求二:argv 賦值導致其他字串變數異常

**原因**:`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;
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved