字符数组与字符指针的问题

问题描述

字符数组与字符指针的问题

include

int main(void)
{
char*str="hello";
return 0;
}

///////////////////////////////我的疑惑是:为什么上面可以,下面的不可以?

include

int main(void)
{
char*str;
scanf("%s",str);
return 0;
}


解决方案

唔。。比如这样一段代码

通过调试得知指针变量s地址为0xbffff344;str的地址为0xbffff348;

当我们没有为指针变量s赋值时,指针变量的值是不确定的;所以执行scanf时会因非法指针解引用报出segmentation fault。

因此尝试为指针变量s一个可行的值,例如str的地址,当执行完scanf后,指针变量s所指向地址便被输入覆写。即str的值变为输入。

当然,不一定要为s赋str的地址,其他合法的地址也可以。

解决方案二:

为了帮助你理解,你应该学习下内存分配方面的相关知识。给你解释一下吧:
1)上面的char * str = "hello",其中hello是一个字符串常量,在程序编译的时候就已经为这个字符串分配了存储区域,"hello"其实指向的是字符串首地址,并赋值给str,这里是没有问题的。
2)下面的,char str,只是在栈中创建了一个变量,是char *类型,这个变量只占有4个字节,这个变量str中将来存储的是一个指向字符串的地址,而不是字符串本身。调用了scanf("%s",str),
其实是要将读取的字符串写入str指向的数组!但是程序中只是一个指针,并不是一个数组。可能你看到scanf的原型之后,就认为后面的str只要是char
就行了,不是的,char buf[100]中buf确实是char *类型,但是它指向了一个有效的数组,而你这里没有!

解决方案三:

第二种情况:str 没有分配空间,请使用 new 或 malloc 为其分配内存,然后再使用。

解决方案四:

2)中的char str,掉了个

解决方案五:

第一个是str指向字符串“hello”的首地址
第二个str没有赋初值,不知指向哪里,而且也没有分配足够的空间去存储输入的字符串

解决方案六:

****,掉了******

解决方案七:

#include
#include
int main(void)
{
char *str = (char *)malloc(10);
scanf("%s",str);
printf("%sn",str);
free(str);
str = NULL;
return 0;
}

时间: 2024-09-02 21:06:39

字符数组与字符指针的问题的相关文章

《C语言解惑》—— 2.7 别混淆字符数组和字符

2.7 别混淆字符数组和字符 [例2.9]下面的程序正确吗? #include <stdio.h> void main() { char st[]="When you go home?"; printf("%s\n",st); //1 printf("%c\n",st[5]); //2 printf("%s\n",st[5]); //3 } [解答]编译能通过,但结果不正确.第1条输出语句中的st代表字符串的首地址

C语言及程序设计提高例程-28 字符串、字符数组、字符指针

贺老师教学链接  C语言及程序设计提高 本课讲解 用指向字符的指针引用字符串 #include <stdio.h> int main( ) { char str[]="I am happy"; char *s; s=str; puts(str); puts(s); return 0; } 杜绝(指向字符的)野指针 (1) #include <stdio.h> int main( ) { char str[80]; char *s=str; gets(s); pu

c语言-C语言关于字符指针变量和字符数组的说法

问题描述 C语言关于字符指针变量和字符数组的说法 下列关于字符指针变量和字符数组的说法错误的是 A)字符指针变量的值可以变化 B)字符数组的值可以变化 C)字符指针变量代表了一个地址 D)字符数组代表了一个地址 ====答案选B,求解释? 解决方案 选择B.字符数组相当于指针常量. 解决方案二: 数组定义时系统给开辟内存单元,数组名相当于数组的开始地址是不能变化的 解决方案三: C语言字符指针和字符数组C语言中,为什么字符串可以赋值给字符指针变量字符数组和字符指针

字符数组,字符指针,sizeof,strlen总结

先看下面这一段代码,读者可以自己思考一下,是否自己可以完全答对 // test.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <iostream> #include<cstdio> #include <string> using namespace std; struct{ short a1; short a2; s

c语言-结构体内指针字符数组的释放

问题描述 结构体内指针字符数组的释放 问题:结构体成员char* name和结构体struct student* studentIOS同时释放的话回报错,错误见代码中注释.请问这里要怎么释放呢?还是结构体里面不能这样使用指针字符数组? #include #include struct student{ int id; //长度:4 char* name; //8 int score[2]; //8 float avgScore; //4 }; void input(struct student*

c语言字符数组与字符串的使用详解_C 语言

1.字符数组的定义与初始化字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素.char str[10]={ 'I',' ','a','m',' ','h','a','p','p','y'};即把10个字符分别赋给str[0]到str[9]10个元素如果花括号中提供的字符个数大于数组长度,则按语法错误处理:若小于数组长度,则只将这些字符数组中前面那些元素,其余的元素自动定为空字符(即 '\0' ). 2.字符数组与字符串在c语言中,将字符串作为字符数组来处理.(c++中不是)在实际应用

关于字符数组 和 字符串比较 C++

char acStr[] = "aaaaa";//这个是字符数组,只含有5个字符char *pcStr = "aaaaa";//这个是字符串,含有6个字符,即5个a加一个结束符'\0'   输出的结果 strlen()长度都是5, 所以即便是字符串,最后取长度的时候,也不考虑\0:   strlen()计算字符串长度,忽略结束符 \0 char *p = "hello";char *q = "world";char o[] =

深入解析C++中的字符数组和处理字符串的方法_C 语言

C++字符数组 用来存放字符数据的数组是字符数组,字符数组中的一个元素存放一个字符.字符数组具有数组的共同属性.由于字符串应用广泛,C和C++专门为它提供了许多方便的用法和函数. 字符数组的定义和初始化 定义字符数组的方法与前面介绍的类似.例如: char c[10]; c[0]=′I′;c[1]=′ ′;c[2]=′a′;c[3]=′m′;c[4]=′ ′;c[5]=′h′;c[6]=′a′;c[7]=′p′;c[8]=′p′;c[9]=′y′; 上面定义了c为字符数组,包含10个元素.在赋值

java-字符数组输出字符还是地址的问题

问题描述 字符数组输出字符还是地址的问题 为什么char[] c=new char[]{'a','b','c'};System.out.println(c);输出的不是地址,而是abc 解决方案 这是println方法重载.java打印输出System.out.println会调用输入参数的toString方法,输出内容是toString方法的返回值 println的参数分基本类型,String和Object类型 解决方案二: System.out 是一个 PrintStream 对象,你看看文