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]。
二、代码中的其他致命问题
除了编译错误,你的代码还有几个核心逻辑错误:
- sizeof在函数内部无法获取原数组长度:数组传入函数后退化为指针,
sizeof(shift_array1)得到的是指针的字节数(如64位系统为8),而非原数组的总大小,因此sizeof(shift_array1)/sizeof(shift_array1[0])计算的元素个数完全错误。必须在main函数中先计算数组长度,再作为参数传给函数。 - 错误的数组声明:你写的
char* new_array_1[shift_nums2][10];属于指针数组,而你需要的是存储字符串的二维char数组,应去掉char*,改为char new_array_1[shift_nums2][10];。 - 未定义变量与作用域错误:代码中多次使用未声明的
shift_nums变量;且在for循环内部声明的临时数组,循环结束后就会销毁,根本无法起到临时存储的作用。 - 交换逻辑混乱:现有代码没有实现有效的数组内容交换,只是重复创建临时数组,复制方向和逻辑完全错误。
三、修正后的完整代码
#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
相关产品推荐
相关产品推荐

