`
CreazyApple
  • 浏览: 63784 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

关于字符指针和字符数组的一些错误

 
阅读更多

老犯此类错误!!!
char *p = "abc";则abc存储在常量存储区,而p直接指向了这个常量存储区,所以不能改变abc的内容
*p = 'd'; 是错误的,因为是常量存储区,不能改变。

char *p = NULL;
*p = 'd';
也是错误的。
char *p;
*p='d';
也是错误的,提示指针没有赋初值。
以上几种更不可以strcpy(p,"abc");

总之,上面的指针都相当于const char *p,不能修改*p的内容!但可以修改其指向,如:

char *a = "abc";
p = a;

是可以的。但这样的操作不安全!!因为如果一旦a被回收了,p就跟着完蛋了。尤其是如果在子函数中,局部变量自动回收,这种不安全行为就会突出。




字符数组:
char p[]="abc";//相当于strcpy(p,“abc”),如果定义在全局,abc就在全局区,如果在局部,abc就在栈内。
*p = 'd'; 是正确的,
不过这样的p已经固定了其长度(为3+1=4),p相当于数组p[4],且p[3]=='\0'
printf("%d\n",p[3]);
p[3] = 'b';
printf("%d\n",p[3]);
都是可以的。
但p[4] = 'd'越界

总之,字符数组相当于有限长度的char *const p;

可以修改内容,但不可以修改指向



如果想要一个可以改变值且不固定长度的字符串,安全的办法就是使用动态分配malloc和realloc
char *a = "abc";
char *p = (char *)malloc(sizeof(char)*strlen(a));
strcpy(p,a);
是正确的。


另外对于字符串或者数组,要时刻注意在后面添加结束符'\0',否则极易出问题,比如

	int i;
	char a[5];
	for(i=0; i<4; i++)a[i]=i+'0';
	printf("%s",a);

没有结束符,打印出来是乱码。

安全简单的做法是声明数组时让其元素初始化为{0}

	int i;
	char a[5] = {0};
	for(i=0; i<4; i++)a[i]=i+'0';
	printf("%s",a);

当然不能把最后一个结束符都挤掉了,比如下面的也会出问题

	int i;
	char a[5] = {0};
	for(i=0; i<5; i++)a[i]=i+'0';
	printf("%s",a);

因为最后的结束符a[4] 被冲掉了。

分享到:
评论

相关推荐

    C语言用指针将字符串数组位置颠倒

    C语言用指针将字符串数组位置颠倒,实现ABCDEFGHIJKLMNOPQRSTUVWXYZ转换成ZYXWVUTSRQPONNOPQRSTUVWXYZ

    字符数组与字符指针

    在C/C++编程语言中,字符数组和字符指针是非常重要的数据类型,尤其是在处理文本数据时。这两种类型的使用非常广泛,但在实际编程过程中,不少开发者往往会在它们之间产生混淆,导致程序出现错误。本文将详细介绍...

    字符串指针与字符数组的区别

    字符串指针字符串指针与字符数组的区别与字符数组的区别 转载

    栈字符数组&混淆指针和数组所导致的错误

    在编程世界中,栈字符数组和指针与数组的关系是两个重要的基础知识,它们在实际编程中经常被使用,但同时也容易引发错误。本文将详细探讨这两个主题,旨在帮助你理解和避免相关的问题。 首先,让我们来看看栈字符...

    数组指针和指针数组的区别

    但是,p3 的定义是正确的,而 p4 的定义是错误的,因为 p4 的右边是一个指向单个字符的指针,而左边是指向整个数组的指针。 五、地址的强制转换 在下面的例子中,我们定义了一个结构体 Test: ```c struct Test{ ...

    字符数组字符指针sizeofstrlen的一点总结

    在C语言中,字符数组和字符指针是处理文本数据的两种常见方式。字符数组通常用于存储固定长度的字符串,而字符指针则用于指向字符串的首地址。 #### 二、字符串直接量的特点 1. **字符串直接量与结束符**: - ...

    C语言教学课件:14-3_指针数组(用于处理二维数组或多个字符串).ppt

    例如,下面是一个两维字符数组的定义: ```c char color1[][6]={"RED","GREEN","BLUE"}; ``` 这个数组的每个元素是一个字符串,而不是指针。相比之下,指针数组的每个元素是一个指针,指向一个字符串。 四、指针...

    第5讲 指针高级之指针数组-将若干字符串按字母顺序(由小到大)输出

    总结起来,本讲介绍了如何使用指针数组来存储和排序字符串。通过定义一个指针数组,初始化各个元素指向字符串,然后对指针数组进行排序,可以实现字符串的字母顺序输出。这种技巧在处理动态数据集或需要高效排序时...

    C语言第讲指针与字符串字符数组PPT课件.pptx

    在C语言中,指针和字符数组都是处理字符串的重要工具,但它们之间存在显著的区别。 1. **字符指针与字符数组的区别** - **存储格式**:字符指针(变量)存储的是字符串的首地址,即一个内存地址(通常为2字节)。...

    第8章 指针-3字符数组和字符指针 - 字符串的输入和输出1

    在C语言中,字符数组和字符指针是处理字符串(以'\0'为结束符的字符序列)的重要工具。本章主要讨论了如何通过指针进行字符串的输入和输出。 首先,字符数组用于存储字符串。例如,定义了一个大小为81(包括一个...

    C语言中关于字符数组与字符指针

    使用字符数组和字符指针时,对字符串操作函数的使用也有一些区别。例如,strcpy、strcat等函数,它们需要传递数组名或者指针变量来操作字符串: ```c strcpy(str, "Another string"); // 字符数组操作 strcat(str, ...

    用指针数组的方法将字符串排序

    每个元素都是一个指向字符数组(即字符串)的指针。 2. **字符串排序**:字符串排序通常是指按照字典顺序对字符串进行排序,可以是升序或降序。在计算机科学中,排序算法是基础而关键的一部分,它影响着数据处理的...

    使用指针、数组处理在C语言中处理“字符串”

    字符串可以使用字符数组或字符指针来表示。 #### 字符数组表示法 ```c char str[6] = "hello"; ``` 这里 `str` 是一个长度为6的字符数组,最后一个元素是结束符`\0`。 #### 字符指针表示法 ```c char *ptr = ...

    易语言指针操作字符串和数组

    本篇文章将深入探讨易语言中如何使用指针来操作字符串和数组,以及如何通过指针数组进行参数传递。 1. **指针基础**: - 在易语言中,指针是一个变量,存储的是其他变量的内存地址。指针变量需要先声明,然后通过`...

    指针进阶之指针数组和数组指针

    // 字符指针数组,数组里面有5个元素,每个元素是char*类型 ``` 指针数组的用法有很多,例如可以将一些变量的地址存放进一个数组里面。例如: ```c int a = 10; int b = 20; int c = 30; int d = 40; int* arr[4] =...

    c++ 二级指针与二维数组之间值操作

    二维数组在C++中本质上是一级指针的数组,每个元素又是一个一级指针,指向一维字符数组。因此,二级指针可以用来直接访问和修改这些一维数组的内容。下面将详细解释这个过程: 1. **二级指针的声明**: 在C++中,...

    C语言中的字符串数组和字符串指针

    本文档在某知名网站下载,要么浏览量最多,要么最新,保证精品,至少为你节约3RMB。格式为caj或者kdh需要专业阅读器打开。

    C#将字符串数组传递给C++ DLL.rar

    注意,由于是宽字符数组,我们应使用`LPCWSTR`(常量宽字符指针)来处理每个字符串: ```cpp void ProcessStrings(int count, wchar_t** strings) { for (int i = 0; i ; i++) { wprintf(L"%ls\n", strings[i]);...

    第9章 指针和数组-4指针数组及其应用 - 用指针数组表示多个字符串1

    本章主要讨论了如何使用指针数组来存储和操作多个字符串,以及这种存储方式相对于二维字符数组的优势。 首先,我们来看一个常见的问题:如何有效地存储一组字符串?一种方式是使用二维字符数组,如`char country[]...

Global site tag (gtag.js) - Google Analytics