You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言交换字符串数组报错:expected declaration specifiers before '*' token

字符串数组交换代码的编译错误分析与修复

一、编译错误的原因

你遇到的error: expected declaration specifiers or '...' before '*' token错误,根源是函数参数声明不符合C语言语法规则:

  • C语言要求函数参数必须先明确指定类型,再写变量标识符。你写的void shift_change(*shift_array1, *shift_array2);中,*shift_array1前面没有声明类型,编译器无法识别这是什么类型的指针,因此报错。
  • 由于你传入的是二维char数组(char [][10]),数组作为函数参数时会自动退化为指向一维数组的指针,正确的参数类型应该是char (*)[10]。

二、代码中的其他致命问题

除了编译错误,你的代码还有几个核心逻辑错误:

  1. sizeof在函数内部无法获取原数组长度:数组传入函数后退化为指针,sizeof(shift_array1)得到的是指针的字节数(如64位系统为8),而非原数组的总大小,因此sizeof(shift_array1)/sizeof(shift_array1[0])计算的元素个数完全错误。必须在main函数中先计算数组长度,再作为参数传给函数。
  2. 错误的数组声明:你写的char* new_array_1[shift_nums2][10];属于指针数组,而你需要的是存储字符串的二维char数组,应去掉char*,改为char new_array_1[shift_nums2][10];。
  3. 未定义变量与作用域错误:代码中多次使用未声明的shift_nums变量;且在for循环内部声明的临时数组,循环结束后就会销毁,根本无法起到临时存储的作用。
  4. 交换逻辑混乱:现有代码没有实现有效的数组内容交换,只是重复创建临时数组,复制方向和逻辑完全错误。

三、修正后的完整代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 函数声明:传入指向一维char数组的指针,以及两个数组的长度
void shift_change(char (*shift_array1)[10], char (*shift_array2)[10], int len1, int len2);

int main(int argc, char* argv[]) {
    char shift_array1[][10] = {"Sun", "Tue", "Thu", "Sat"};
    char shift_array2[][10] = {"Mon", "Wed", "Fri"};
    // 在main中计算数组长度(此时数组未退化为指针,sizeof有效)
    int len1 = sizeof(shift_array1) / sizeof(shift_array1[0]);
    int len2 = sizeof(shift_array2) / sizeof(shift_array2[0]);

    printf("交换前:\n");
    printf("数组1:");
    for (int i = 0; i < len1; i++) {
        printf("%s ", shift_array1[i]);
    }
    printf("\n数组2:");
    for (int i = 0; i < len2; i++) {
        printf("%s ", shift_array2[i]);
    }
    printf("\n");

    shift_change(shift_array1, shift_array2, len1, len2);

    printf("交换后:\n");
    printf("数组1:");
    for (int i = 0; i < len2; i++) {
        printf("%s ", shift_array1[i]);
    }
    printf("\n数组2:");
    for (int i = 0; i < len1 && i < len2; i++) {
        printf("%s ", shift_array2[i]);
    }
    printf("\n");

    return 0;
}

void shift_change(char (*shift_array1)[10], char (*shift_array2)[10], int len1, int len2) {
    // 创建临时数组保存原数组内容
    char temp1[len1][10];
    char temp2[len2][10];

    // 备份原数组1的所有元素
    for (int i = 0; i < len1; i++) {
        strcpy(temp1[i], shift_array1[i]);
    }
    // 备份原数组2的所有元素
    for (int i = 0; i < len2; i++) {
        strcpy(temp2[i], shift_array2[i]);
    }

    // 将数组2的内容复制到数组1(注意数组1的长度需足够容纳数组2的元素)
    for (int i = 0; i < len2; i++) {
        strcpy(shift_array1[i], temp2[i]);
    }
    // 将数组1的内容复制到数组2(数组2长度不足时,只复制对应长度的元素)
    for (int i = 0; i < len1 && i < len2; i++) {
        strcpy(shift_array2[i], temp1[i]);
    }
    // 可选:清空数组1中超出数组2长度的剩余元素
    for (int i = len2; i < len1; i++) {
        shift_array1[i][0] = '\0';
    }
}

内容的提问来源于stack exchange,提问作者Chris Chen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 17:57:02