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

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会导致未定义行为,程序可能崩溃。

修正步骤

  1. 正确赋值指针:直接给CurrentString赋值,不需要解引用。因为CurrentString本身就是指针,要让它指向AllStrings里的某个字符串,直接写:
    // 初始化时直接赋值,避免野指针
    char *CurrentString = AllStrings[1];
    // 后续修改时也直接赋值
    CurrentString = AllStrings[printCol + 1];
    
  2. 修正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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 00:15:08