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

char* string与char string[n]的区别及代码报错原因咨询

C代码中字符串声明不同导致运行差异的原因解析

先看你写的代码:

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

int main()
{
    char* string;
    char n;
    while(scanf("%s",string)!=EOF){
        
        printf("\n%s\n",string);
    }

    return 0;
}

下面分三种情况解释差异:

  • 用char* string时程序报错
    char* string只是声明了一个字符指针变量,但没有给它分配任何有效的内存空间。这个指针会指向内存中一个随机的地址,可能是系统保护的内存区域,也可能是其他程序正在使用的内存。当scanf尝试把输入的字符串写入这个随机地址时,会触发内存访问错误,导致程序报错或崩溃,这属于C语言里的未定义行为。

  • 改为char string[50]后正常运行
    char string[50]是在栈上声明了一个固定大小的字符数组,系统会为它分配50字节的连续内存空间。数组名string本质是指向这块内存起始地址的指针,scanf可以安全地把输入的字符串写入这块已经合法分配的内存(只要输入的字符串长度不超过49,因为最后一个字节要留给字符串结束符'\0'),所以程序能正常读取和输出内容。

  • char string[n]能正常回显输入
    这是C99标准引入的变长数组(VLA)特性,它会根据变量n的值在栈上动态分配对应大小的内存空间。虽然你的代码里n没有初始化,运行时会是一个随机的非零值,但只要这个值足够容纳输入的字符串,string就会指向一块合法的栈内存,scanf就能正常写入,所以可以回显输入内容。不过这种写法有风险:如果n的值太小,或者输入的字符串太长,会导致栈溢出,同样触发未定义行为。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 22:57:25