char *p[n][ n] 是什么意思 是一个三层char指针 string吗 请详解

int del_srubstr(char *str,char const *substr)
n=strlen(substr);//为什么我用gdb跟的时候,n的值$1 = 10922
temp=(char *)malloc(n+1);
memset(temp,0x00,n+1);
memcpy(temp,str,n);
if (strcmp(temp,substr)==0)
return TRUE;
return FALSE;
int main()
char *stra=&ABCDEF&;
char *strb=&XRCQEF&;
char *strc=&CD&;
//char *s;
//s=find_char(stra,strb);
//printf(&%c&,*s);
del_srubstr(stra,strc);
printf(&%s&,stra);
------解决方案--------------------1、strlen那里应该没有问题吧。2、下面这段代码貌似有问题的说,你到底想实现什么功能?
C/C++ code
//memcpy(temp,str,n);
// 应该是这样的吧
memcpy(temp, p, n);
if (strcmp(temp,substr)==0)
return TRUE;
// 添加代码
memset(temp,0x00,n+1);
------解决方案-------------------- n=strlen(substr);//这条语句没执行前,n的值未知
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 1234567891011 Copyright & &&版权所有深入理解c++指针的指针和指针的引用
投稿:jingxian
字体:[ ] 类型:转载 时间:
下面小编就为大家带来一篇深入理解c++指针的指针和指针的引用。小编觉得挺不错的,现在就分享给大家,也给大家做个参考,一起跟随小编过来看看吧
展示一下使用指针的指针和指针的引用修改传递给方法的指针,以便更好的使用它。(这里说的指针的指针不是一个二维数组)
为什么需要使用它们
当我们把一个指针做为参数传一个方法时,其实是把指针的复本传递给了方法,也可以说传递指针是指针的值传递。
如果我们在方法内部修改指针会出现问题,在方法里做修改只是修改的指针的copy而不是指针本身,原来的指针还保留着原来
的值。我们用下边的代码说明一下问题:
int m_value = 1;
void func(int *p)
int main(int argc, char *argv[])
int n = 2;
int *pn = &n;
cout && *pn &&
cout && *pn &&
看一下输出结果
输出的是两个2
使用指针的指针
展示一下使用指针的指针做为参数
void func(int **p)
// 也可以根据你的需求分配内存
int main(int argc, char *argv[])
int n = 2;
int *pn = &n;
cout && *pn &&
func(&pn);
cout && *pn &&
我们看一下 func(int **p)这个方法
•p:& 是一个指针的指针,在这里我们不会去对它做修改,否则会丢失这个指针指向的指针地址
•*p: 是被指向的指针,是一个地址。如果我们修改它,修改的是被指向的指针的内容。换句话说,我们修改的是main()方法里 *pn指针
•**p:两次解引用是指向main()方法里*pn的内容
指针的引用
再看一下指针的引用代码
int m_value = 1;
void func(int *&p)
// 也可以根据你的需求分配内存
int main(int argc, char *argv[])
int n = 2;
int *pn = &n;
cout && *pn &&
cout && *pn &&
看一下func(int *&p)方法
•p:&是指针的引用,main()方法里的 *pn
•*p:是main()方法里的pn指向的内容。
以上这篇深入理解c++指针的指针和指针的引用就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具指针是C语言的灵魂,同时也是最让初学者头痛的一个知识点,本文主要分项了安全及指针使用问题。
指针的声明与初始化
1、不恰当的指针声明
考虑如下的声明:
int* ptr1, ptr2; // ptr1为指针,ptr2为整数
正确的写法如下:
int* ptr1, *ptr2;
用类型定义代替宏定义是一个好的习惯,类型定义允许编译器检查作用域规则,而宏定义不一定会。
使用宏定义辅助声明变量,如下所示:
#define PINT int*
PINT ptr1, ptr2;
不过结果和前面所说的一致,更好的方法是使用下面的类型定义:
typedef int* PINT;
PINT ptr1, ptr2;
2、使用指针未初始化
在使用指针之前未初始化会导致运行时错误,如下面的代码:
printf("%d\n", *p);
指针p未被初始化,可能含有垃圾数据
3、处理未初始化指针
总是用NULL来初始化指针
用assert函数
用第三方工具
把指针初始化为NULL更容易检查是否使用正确,即便这样,检查空值也比较麻烦,如下所示:
int *pi = NULL;
if(pi == NULL) {
//不应该解引pi
//可以使用pi
我们可以使用assert函数来测试指针是否为空值:
assert(pi != NULL);
指针的使用问题
缓冲区溢出
缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,使得溢出的数据覆盖在合法数据上,理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符,但是绝大多数程序都会假设数据长度总是与所分配的储存空间相匹配,这就为缓冲区溢出埋下隐患。操作系统所使用的缓冲区又被称为”堆栈”.。在各个操作进程之间,指令会被临时储存在”堆栈”当中,”堆栈”也会出现缓冲区溢出。
下面几种情况可能导致缓冲区的溢出:
访问数组元素时没有检查索引值
对数组指针做指针算术运算时不够小心
用gets这样的函数从标准输入读取字符串
误用strcpy和strcat这样的函数
1、测试NULL
使用malloc这样的函数的时候一定要检查返回值,否则可能会导致程序的非正常终止,下面是一般的方法:
float *vector = malloc(20 * sizeof(float));
if(vector == NULL) {
//malloc分配内存失败
//处理vector
2、错误使用解引操作
声明和初始化指针的常用方法如下:
int *pi = &
下面是一种看似等价但是错误的声明方法:
3、迷途指针
4、越过数组边界访问内存
没有什么可以阻止程序访问为数组分配的空间以外的内存,下面的例子中,我们声明并初始化了三个数组来说明这种行为:
#include&stdio.h&
int main()
char firstName[8] = "1234567";
char middleName[8] = "1234567";
char lastName[8] = "1234567";
middleName[-2] = 'X';
middleName[0] = 'X';
middleName[10] = 'X';
printf("%p %s\n", firstName, firstName);
printf("%p %s\n", middleName, middleName);
printf("%p %s\n", lastName, lastName);
运行结果如下:
下图说明了内存分配情况:
5、错误计算数组长度
将数组传给函数时,一定要同时传递数组长度,这个信息帮助函数避免越过数组边界
#include&stdio.h&
void replace(char buffer[], char replacement, size_t size)
size_t count = 0;
while(*buffer && count++ & size) {
int main()
char name[8];
strcpy(name, "Alexander");
replace(name, '+', sizeof(name));
printf("%s\n", name);
6、错误使用sizeof操作符
其中一个例子是试图检查指针边界但方法错误
#include&stdio.h&
int main()
int buffer[20];
int *pbuffer =
for(int i = 0; i & sizeof(buffer); i++) {
*(pbuffer++) = 0;
改为:i & sizeof(buffer) / sizeof(int);
7、有界指针
有界指针是指指针的使用被限制在有效的区域内,C没有对这类指针提供直接的支持,但是可以自己显示地确保。如下所示:
#define SIZE 32
char name[SIZE];
if(name != NULL) {
if(p &= name && p & name + SIZE) {
//有效指针,继续
//无效指针,错误分支
一种有趣的变化是创建一个指针检验函数;
下面的代码定义一个函数消除无效指针:
int valid(void *ptr) {
return (ptr != NULL);
下面的代码依赖于_etext的地址,定义于很多的类linux操作系统,在windows上无效:
#include &stdio.h&
#include &stdlib.h&
int valid(void *p) {
extern char _
return (p != NULL) && ((char*) p & &_etext);
int main(void) {
printf("pointer to local var valid? %d\n", valid(&local));
printf("pointer to static var valid? %d\n", valid(&global));
printf("pointer to function valid? %d\n", valid((void *)main));
int *p = (int *) malloc(sizeof(int));
printf("pointer to heap valid? %d\n", valid(p));
printf("pointer to end of allocated heap valid? %d\n", valid(++p));
free(--p);
printf("pointer to freed heap valid? %d\n", valid(p));
printf("null pointer valid? %d\n", valid(NULL));
在linux平台运行结果如下:
pointer to local var valid? 1
pointer to static var valid? 1
pointer to function valid? 0
pointer to heap valid? 1
pointer to end of allocated heap valid? 1
pointer to freed heap valid? 1
null pointer valid? 0
另一种方法是利用ANSI-C和C++的边界检查工具(CBMC)
在文章中找不到问题答案?您还可以
热门栏目订阅}

我要回帖

更多关于 char指针 string 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信