C语言:将字符串数组元素赋值给字符串指针出现类型转换警告
问题描述
我正在开发一个用WASD键控制玩家在4x4网格移动的C程序,尝试将字符串数组中的字符串字面量赋值给字符串指针CurrentString时,出现如下警告:
warning: assignment to 'char' from 'char*' makes integer from pointer without a cast [-Wint conversion]
警告出现于*CurrentString = &AllStrings[1];和*CurrentString = &AllStrings[(printCol + 1)];位置。我尝试移除CurrentString的间接寻址运算符也未解决问题,以下是部分代码:
#include <string.h> #include <stdio.h> int main() { int x, y, z = 0; int column = 0; int row = 0; int printBy; int printCol; int Verify = 0; char player_response; char *AllStrings[5] = {" ", "O ", " O ", " O ", " O"}; char *CurrentString; //declaring CurrentString *CurrentString = &AllStrings[1]; *CurrentString = AllStrings[1]; printf("\n%s", *CurrentString); x = 1; while (x < 4) { printf("\n%s", AllStrings[0]); x++; } x = 0; do { scanf("%c", &player_response); switch(player_response) { case 'w': system("clear"); row -= row; //`row` ascends in value top to bottom, starting at 0. for (x = 0; x < 4; x++) { if (row == x) { printBy = x; Verify = 1; } } //end for if (Verify != 1) { row += row; } if (Verify == 1) { while (y < printBy) { printf("\n%s", AllStrings[0]); y++; } printf("\n%s", *CurrentString); y = (row + 1); while (y < 4) { printf("\n%s", AllStrings[0]); y++; } } //end if y = 0; x = 0; Verify = 0; break;
解决方法
错误原因
你声明的CurrentString是char*类型(指向字符的指针),但*CurrentString是对指针的解引用,访问的是它指向的单个char字符。而AllStrings[1]是char*类型(因为AllStrings是char*数组,每个元素都是指向字符串的指针),把一个指针赋值给单个char,会触发类型不匹配警告——指针会被当作整数处理,这就是警告里提到的“从指针生成整数但未做强制类型转换”。
另外,&AllStrings[1]是char**类型(指向指针的指针),赋值给char类型的*CurrentString,类型差了两级,错误更严重;而且初始时CurrentString是未初始化的野指针,直接解引用*CurrentString会导致未定义行为,程序可能崩溃。
修正步骤
- 正确赋值指针:直接给
CurrentString赋值,不需要解引用。因为CurrentString本身就是指针,要让它指向AllStrings里的某个字符串,直接写:// 初始化时直接赋值,避免野指针 char *CurrentString = AllStrings[1]; // 后续修改时也直接赋值 CurrentString = AllStrings[printCol + 1]; - 修正printf参数:
printf的%s格式符需要char*类型的参数,你之前写的printf("\n%s", *CurrentString);里的*CurrentString是char类型,会导致错误,应该改成:printf("\n%s", CurrentString);
修正后的代码片段示例
#include <string.h> #include <stdio.h> int main() { int x, y, z = 0; int column = 0; int row = 0; int printBy; int printCol; int Verify = 0; char player_response; char *AllStrings[5] = {" ", "O ", " O ", " O ", " O"}; char *CurrentString = AllStrings[1]; // 正确初始化指针 printf("\n%s", CurrentString); // 正确传递字符串指针给printf x = 1; while (x < 4) { printf("\n%s", AllStrings[0]); x++; } // 后续代码保持逻辑不变,注意修改其他赋值CurrentString的地方
内容的提问来源于stack exchange,提问作者c_and_me1
相关产品推荐
相关产品推荐

