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

C語言傳指針參數賦值正確姿勢:malloc + 逐字符/strcpy vs 直接賦值失敗

     編輯:關於C語言

現象

函數接收 char *mallo(已 malloc),內部賦值方式成敗:

  • 失敗:mallo = "bag"; —— 只修改局部指針副本,外部不見變化。
  • 成功:逐字符 *(mallo++) = ... 或 mallo[i] = ... —— 寫入指向的內存。
  • 成功:strcpy(mallo, "bag"); —— 庫函數逐字符拷貝含 \0。

原理

  • 指針按值傳遞,函數內 mallo 是副本,指向同一堆塊。
  • mallo = "literal" 讓副本指向常量區,脫離原堆塊。
  • 解引用 *mallo 或下標 mallo[i] 才能寫入原堆塊。

完整代碼

[cpp]
#include 
#include 
#include 

void memtest(char *mallo) {
    // 逐字符賦值
    for (int i = 0; i < 36; i++) mallo[i] = 'a' + rand() % 26;
    // 或 strcpy(mallo, "bag");
    // 切勿 mallo = "bag";
    printf("函數內:%s\n", mallo);
}

int main() {
    char *mallo = malloc(36);
    if (!mallo) { printf("malloc failed\n"); return 1; }
    memtest(mallo);
    printf("主函數:%s\n", mallo); // 可見修改
    free(mallo);
    return 0;
}

注意

  • strcpy 需 #include ,否則隱式聲明可能導致錯誤。
  • 務必 free 釋放堆內存。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved