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

C語言函數傳遞數組賦值:正確使用循環或memcpy而非初始化列表

     編輯:程式設計綜合問答

錯誤代碼

void arrin(int *arr) {
    arr[] = {1,1,2,2,3,3,4,5,6,5,6,7,7,8,8,9,9,0,0}; // 編譯錯誤
    for(int i=0; i<20; i++) printf("%d", arr[i]);
}

錯誤原因

初始化列表 `{...}` 僅能在變量**定義時**使用**,不能用於已分配內存的賦值。

  • `int arr[] = {1,2,3};` ✅ 定義並初始化
  • `arr = {1,2,3};` ❌ 賦值語句,非法
  • `arr[] = {1,2,3};` ❌ 語法錯誤

正確方案

方案一:循環賦值(最通用)

void arrin(int *arr, int n) {
    int src[] = {1,1,2,2,3,3,4,5,6,5,6,7,7,8,8,9,9,0,0};
    int len = sizeof(src)/sizeof(src[0]);
    for (int i = 0; i < n && i < len; i++) {
        arr[i] = src[i];
    }
}

方案二:memcpy 內存拷貝(最高效)

#include 
void arrin(int *arr, int n) {
    int src[] = {1,1,2,2,3,3,4,5,6,5,6,7,7,8,8,9,9,0,0};
    size_t bytes = sizeof(src);
    if (n * sizeof(int) < bytes) bytes = n * sizeof(int);
    memcpy(arr, src, bytes);
}

方案三:靜態只讀數組 + 指針返回(零拷貝)


const int *get_data(int *len) {
    static const int data[] = {1,1,2,2,3,3,4,5,6,5,6,7,7,8,8,9,9,0,0};
    *len = sizeof(data)/sizeof(data[0]);
    return data;
}
// 調用
int len; const int *p = get_data(&len);
// 使用 p[0]...p[len-1] 只讀訪問

調用示例

int main() {
    int testarr[20];
    arrin(testarr, 20); // 或 memcpy 版
    for (int i=0; i<20; i++) printf("%d ", testarr[i]);
    return 0;
}

核心知識點

  • 數組名作參數退化為指針,函數內**無法獲取數組長度**,必須額外傳遞長度參數
  • 初始化列表屬於**聲明語法**,非執行期賦值操作
  • `memcpy` 處理 POD 類型(int、struct無虛函數)最高效,但需注意長度截斷
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved