修改指向指针的数组中对应元素的字符出现异常,该如何解决?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了修改指向指针的数组中对应元素的字符出现异常,该如何解决?相关的知识,希望对你有一定的参考价值。

在调试C语言程序时遇到的情况

指向指针的数组定义如下:

char * msg[5] =

" Thank you for the wonderful evening, ",
"You certainly prove that a ",
"is a special kind of guy. We must get together",
"over a delicious ",
" and have a few laughs"
;

然后定义了一个指向char*类型的指针:

char* *pt=msg;

当我想用下面语句修改字符串其中一个字符时出现异常:

**pt='K';//编译没错误,但运行出现异常

就是将msg[0]元素的第一个字符修改为k时出现的异常,整体修改数组元素就没有任何问题

譬如:*pt="fajlgjalhglajlg";//运行正常

char * msg[5] =

" Thank you for the wonderful evening, ",
"You certainly prove that a ",
"is a special kind of guy. We must get together",
"over a delicious ",
" and have a few laughs"
;
这句话定义了一个指针数组,该数组里面有5个指针,仅仅是指针,而没有分配任何的内存空间给它们,而所谓的赋值,只是把这5个常量字符串的首地址赋给了这5个指针变量,也就是说赋值让该指针数组的5个成员分别指向了5个常量字符串
我们知道,常量所在的空间地址是系统分配,上面的内容不允许更改,因此你想改变常量的值,当然会非法。
而对于*pt="fajlgjalhglajlg";这句代码来说,就是改变了指针的指向而已,让它指向了另外一个常量的地址,当然可以成功

记住,指针没有分配空间的时候,任何修改值的操作都是相当危险的!!!

如果分配了内存,赋值就不会出问题,请参考以下代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void main()

int i=0;
char * msg[5];
char* *pt=msg;

msg[0] = (char *)malloc(100);
strcpy(msg[0], " Thank you for the wonderful evening, ");

**pt='K';
参考技术A .(SP)=0063H
因为SP是堆栈指针寄存器,它始终指向栈顶元素。这里要注意的一点是,堆栈定义以后,所谓的栈顶位于该段的低地址端。如果定义的堆栈的大小是64H个字节,那么段内偏移量的范围就在0000H到0063H之间,所以当堆栈为空时,(SP)=0063H。
2.因为你定义的堆栈是字类型的,故大小为32H×2=64H个字节,所以:
当堆栈为空时,(SP)=0063H,理由同上面一样;
当堆栈为满时,(SP)=0000H,原因就不用我说了吧!
不知道我说的到底对不对,仅供参考!!本回答被提问者采纳
参考技术B 实际上指针只能指向变量,但有一个特例:那就是指针可以指向一个字符串.而此时呢这个字符串是一个文字常量,也即就是默认的const型常量.所以是不能修改其里面的值得,那么为了避免这种编译不报错,但运行时却出错的情况,一般在定义指针的时候就需要在前面加上const。。。。。。。。。 参考技术C **pt指向的是常量,不能修改.

#include <stdio.h>

int main()


char msg[5][50] = " Thank you for the wonderful evening, ", "You certainly prove that a ", "is a special kind of guy. We must get together",
"over a delicious ", " and have a few laughs" ;
char* pt = msg[0];
*pt = 'K';
printf("%s\n", msg[0]);
return 0;

C语言如何定义指针指向字符型二维数组

使用指针变量访问二维数组的任意一个元素的方法:

1.使用列指针:定义一个列指针p,让它指向二维数组的第0个元素

int a[3][4];

int *p;

p=&a[0][0];   

//因为a[0]是第0行的数组名,所以p=&a[0][0]相当于p=a[0],因为a[i][j]前面共有i*4+j个元素

该二维数组的任意i行j列元素可表示为*(p+i*4+j)。

2.使用行指针:定义一个行指针p,让它指向二维数组的第0行

int a[3][4];

int (*p)[4];

p=a;   //也可以为p=&a[0];   

其中* ( *(p+i)+j)表示任意一个i行j列的元素。

扩展资料:

数组的使用规则:

1.可以只给部分元素赋初值。当 中值的个数少于元素个数时,只给前面部分元素赋值。例如:static int a[10]=0,1,2,3,4;表示只给a[0]~a[4]5个元素赋值,而后5个元素自动赋0值。

2.只能给元素逐个赋值,不能给数组整体赋值。例如给十个元素全部赋1值,只能写为:static int a[10]=1,1,1,1,1,1,1,1,1,1;而不能写为:static int a[10]=1;请注意:在C、C#语言中是这样,但并非在所有涉及数组的地方都这样,数据库是从1开始。

3.如不给可初始化的数组赋初值,则全部元素均为0值。

4.如给全部元素赋值,则在数组说明中, 可以不给出数组元素的个数。例如:static int a[5]=1,2,3,4,5;可写为:static int a[]=1,2,3,4,5;动态赋值可以在程序执行过程中,对数组作动态赋值。这时可用循环语句配合scanf函数逐个对数组元素赋值。

参考资料:

百度百科-数组

参考技术A

在C语言中,可以通过如下方式来定义指向字符型二维数组的指针:

char c[4][5];  // 定义一个4行5列的字符型二维数组
char (*pc)[5]; // 定义一个含5个元素的数组指针
pc=c;  // 将数组指针pc指向二维字符数组c


注:

char (*pc)[5] 不能写为 char *pc[5]

char (*pc)[5] 表示数组指针,数组中每个元素为char型;

char *pc[5] 表示指针数组,数组中每个元素为char*,也即每个元素为指针。

参考技术B

1、定义二维指针数组与定义一维指针数组差不多,只是矩阵的维度增加了一维而已。

2、下面通过具体的实例来说明如何定义一个二维数组:

int *p[2][3];  // 定义一个二维数组,只是定义,并没有分配地址空间
int i,j;  // 数组的行数和列数
// 下面的2个for循环是用来对二维指针数组进行初始化的,也即分配地址。如果不进行初始化操作,就会使指针变为野指针(即指向不明)。
for(i=0; i<2; i++)
    for(j=0; j<3; j++)
        p[i][j] = (int *)malloc(sizeof(int));
*p[0][1] = 2; // 对指针数组中指针所指向的内存单元进行赋值操作
printf("%d\\n", *p[0][1]);  // 输出结果

参考技术C 定义字符型二维数组:char str[3][10];
定义指针型数组 : char *p[5] = str[0],str[1],str[2];
参考技术D 如定义:int a[3][4];
int *p; p=a[0];此时p就指向0行0列元素

以上是关于修改指向指针的数组中对应元素的字符出现异常,该如何解决?的主要内容,如果未能解决你的问题,请参考以下文章

如何用setData修改数组

C语言,用指针方式定义的字符串为啥不能修改?

如何计算指向不同向量数组中特定对象的指针的出现次数

C语言指向二维数组的指针

将指向数组的指针传递给函数时出现分段错误(C++)

怎样求一个二维数组元素之和以及二维数组元素的最小值及下标