指针赋值,报错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了指针赋值,报错相关的知识,希望对你有一定的参考价值。

很简单的一个语句
char *str = "abcdefg";
str[0]='a'; 为什么报错(我也不知道报什么错,程序就终止掉了)
char str[] = "abcdefg";
str[0]='a';为什么不报错

这涉及到char指针和char数组的关系、区别,你这里就是一种情况;
定义char str[] = "abcdefg";这样一个数组,实际上是申请了8个char大小的空间,既然申请了空间当然可以对这个空间随意赋值。。
定义char *str = "abcdefg";这样一个指针只是定义了一个变量,并没有申请空间,那你对str[0]这个空间进行操作自然报错,因为这个空间根本就不存在。。。追问

非常感谢,方便留个Q吗 我是其他语言转过来的, 弄指针的时候 经常晕..

我还想问你一个问题
char *str; (00000011)
str = malloc(10); (002D0EB0)
这个str 不是一个地址吧, 那正确初始化指针的语句该怎么写那?
char *str = malloc(10);这样吗?

如果我最开始 不知道要给这个指针分多少空间...
char *str <- 这块空间不就浪费了
str=malloc();

追答

char *str;
这句话只是定义了一个str的char类型指针变量,即只分配了一个4字节的指针变量存放的空间,并没有给指针指向的地址分配空间,所以不浪费。。。另外提一点,定义指针时一般提议:
char *str = NULL;
这样可以防止野指针,就像你定义以后,虽然没分配空间,他也指向了一个未知的地址,当你访问这个地址时就会出现未知的错误。。。切记
你说的2种方法都可以,效果一样的;
char *str;
str = malloc(10);

char *str = malloc(10);
这两个一样,指针可以动态的申请空间,你看一下链表就知道了,链表就是使用动态申请的空间来合理的使用内存。。。
QQ:304960988

参考技术A char str[]= "abcdefg";实际上相当于char str[8]="abcdefg";

定义了一个长度为8的字符数组,注意,这个数组是你自己定义的,所以你能修改它的值。

而char *str = "abcdefg";则仅仅是声明了一个指针变量,

这个变量指向了一个常量字符串"abcdefg",而常量字符串的值是不允许修改的。追问

非常感谢, 能留个Q吗 , 我操作指针的时候 经常晕,, 希望能多多帮忙

追答

1227812201

追问

Q没通过,
我还想问一个问题,截取字符的
比方 strcpy(p1,"abcdefg");
我截取abc放到p2指针指像的空间里
但是这个时候 p1原本空间是8个字节长度,少了abc之后,就空出来了3个字节, 我如何释放掉p1里面的这三个字节的空间那
(我想到的是,用个临时空间导一下,但是来回倒又浪费cpu,有没有直接释放掉这三个字节空间的方法,比方写个函数free(p1,1,3)释放首1-3字节)
是不是正规大项目,都是需要对空间这么精打细算的吧?

追答

没办法释放 除非用了动态数组来放 否则 在p1没释放前 就是8个

追问

1,我还想问一个编程习惯的问题, 是不是在方法里 为指针分配空间 不是一个好习惯吧, 应该先分配好了空间 在方法里面改变指针的内容吧?
-------------------------------
2,我还有一个问题
比如:
struct stu char *c;
struct stu a;
a.c = "abc"; 这样是用等号赋值的

我希望的是变成
a.fun("abc");(为a里的c赋值)
我在fun里 怎么能得到 调用它的是那个a成员那?

追答

a.fun fun难道是定义在结构体里的?

本回答被提问者采纳
参考技术B char *str = “abcdefg”;
表示 str 指向一个常量字符串,不可赋值。

char str[] = "abcdefg";
表示 str为一个字符数组,可以被赋值。
参考技术C 第一个str只是一个指针,不是数组,所以没有str[0]之说,如果要建立动态指针数组,可以先定义一个int n;输入n值 ,再定义char *str=new char[n];就可以了 参考技术D 把错误贴出来看看

c语言的二级指针如何初始化了?

争议对指针的理解不够深刻,首先指针也是一个变量。二级指针保存着是一级指针地址的变量,所以int
**ppdata
=
null说明了 这个二级指针保存的是一个一级指针的地址,保存的地址是0;由于保护模式的缘故,(可自行查阅资料),ring3无法对保护段的内存进行读写,所以会出现运行时崩溃。而第一个没报错的原因是因为一级指针虽然初始化保存了0的地址,但是代码在之后的操对一级指针进行重新赋值让其指向了别的内存段。所以没报错。
参考技术A 二维指针初始化分配空间分成两步操作:
先分配二维指针的行数
再分配每行的数据空间
如:
int **p;
int n=10;
int m=100;
p=(int **)malloc( n*sizeof(int *) ); //分配n行
for( i=0;i
评论
0
0
0
加载更多
参考技术B 二维指针初始化分配空间分成两步操作:
1.
先分配二维指针的行数
2.
再分配每行的数据空间
如:
int **p;
int n=10;
int m=100;
p=(int **)malloc( n*sizeof(int *) ); //分配n行
for( i=0;i
评论
0
0
0
加载更多

以上是关于指针赋值,报错的主要内容,如果未能解决你的问题,请参考以下文章

指针定义NULL后无法赋值?

结构体 struct MSG int type; char data[256]; 的指针msg,给msg->data赋值 msg->data="赋值"; 报错?

c语言的二级指针如何初始化了?

C 语言指针数据类型 ( 指针类型变量 与 指针指向的内存块 概念区别 | 指针赋值 | 指针运算 | 内存赋值 | 内存取值 | 内存修改注意事项 )

关于C语言里面指针赋值的类型问题,还有一些关于指针的问题

C语言指针赋值?