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

如何用指针读取并打印数字与字符串?C语言程序报错求助

解决指针读取打印字符串时的段错误问题

嘿,我来帮你排查这个问题!你的代码里数字能正常打印,但字符串触发段错误,核心原因是指针类型不匹配加上printf参数使用错误,咱们一步步拆解:

问题1:指针类型不匹配

你定义的ptr2是int *类型(和ptr一样),但string是char[20]数组。当你写ptr2 = &string;时,&string的类型是char (*)[20](指向长度为20的char数组的指针),把它赋值给int *类型的变量,会导致指针的地址解析完全错误——因为int和char的内存大小、类型语义都不一样,后续访问这个指针时必然出问题。

问题2:printf的%s参数错误

printf("%s")要求传入的是char类型的指针(指向字符串首地址),但你写的是*ptr2,这是取ptr2指向的内存的值(因为ptr2是int*,所以取的是一个int大小的值),把这个int值当成内存地址去访问,操作系统会直接触发段错误(因为这个地址大概率是无效的)。

修正后的代码

/*Reading a number and string and printing on screen using pointers*/
#include <stdio.h>

// main函数规范返回int类型
int main() {
    int number, *ptr;
    // 把ptr2改成char*类型,匹配字符串的指针类型
    char string[20], *ptr2;
    
    ptr = &number;
    // 数组名本身就是首元素的地址,直接赋值给char*即可,不用&
    ptr2 = string;
    
    printf("Enter a number: ");
    scanf("%d", &number);
    printf("Enter a string: ");
    scanf("%s", string);
    
    printf("Your number is: %d\n", *ptr);
    // 直接传ptr2(char*)给%s,不用解引用*ptr2
    printf("String is %s \n", ptr2);
    
    // main函数返回0表示正常结束
    return 0;
}

额外的小建议

  • 记得给main函数指定int返回类型,这是C标准的要求,旧的隐式int写法已经被废弃了。
  • 使用scanf("%s")时要注意输入的字符串长度不要超过数组的大小(这里是20),避免缓冲区溢出,可以改成scanf("%19s", string)来限制输入长度,更安全。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:28:20