C-C 指针数组下标问题,无法从 0开始

发布于 2016-11-01 12:35:02 字数 2137 浏览 1157 评论 1

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>

int main(void){
char *p[]={};
char *temp=NULL;
int end=0;
char y_n=0;
int w=0;//这里 设为0 时 获取 0这个指示元素时出错,设为1时 没有问题
int gc=1;

while(true){
printf("enter content:n");
while((end=getchar())!='n'){
if(gc==1){
p[w]=(char )calloc(gc,sizeof(char)); strcat(p[w],(char *)&end); } else{ temp=(char *)realloc(p[w],gcsizeof(char));
if(temp==NULL){
printf("memory failn");
break;
}
p[w]=temp;
/*here temp and p[w] reference same address
so temp pointer set value is NULL break reference address
so temp pointer not use free function.
if temp pointer use free function,at the same time clean p[w] in memory address.
*/
temp=NULL;
strcat(p[w],(char *)&end);
}
gc++;
}
printf("p[%d]:%sn", w,p[w]);
gc=1;
w++;

printf("continue y or n:");
scanf("%c",&y_n);
if(y_n=='n'){
break;
}
getchar();
}
printf("w:%dn", w);

/test/
while((--w)>=0){
printf("p[%d]:%sn", w,p[w]);
free(p[w]);
p[w]=NULL;
}
/test/
请看截图:

请输入图片描述

当循环 运行到 获取 下标为 0 时的数据时 出现:Segmentation fault (core dumped) 段失败

当上面 定义的 int w=1 初始为 1 时 没有问题
下图是 w=1 时的结果

请输入图片描述

求教这个是什么原因 。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

泛泛之交 2017-09-15 21:46:09

char *p[]={} 错误的写法
-------------------------
首先初始的时候把 char **p=NULL 不指向任何地址,在输入数据后再去动态的分配。

在w=1(代表新一轮新开始的接收字符) 这个判断语句中 加入分配P指针本身可容纳的元素指针地址。p=(char **)realloc(p,(index+1)sizeof(char))

这样每次新一轮的接收字符都会为P这个指针多分配一个字符指针元素。

比如:第一次输入字符 “aaaa” index=0

p=(char **)realloc(p,(index+1)sizeof(char))这样P指针就有一个字符元素指针p[0],index++=1时候又会为p 指针分配两个字符元素指针,此时p指针的元素字符指针 p[index=0],p[index=1],随着index++,不断增加字符元素指针
------------------------------
修改后的代码。

char **p=NULL;
char *temp=NULL;
char c=0;
int index=0;
int w=1;
while(true){
printf("enter charactor:n");
while((c=getchar())!='n'){
if(w==1){
p=(char **)realloc(p,(index+1)*sizeof(char *));
p[index]=(char *)calloc(2,sizeof(char));
*p[index]=c;
*(p[index]+1)='';
}
else{
temp=(char *)realloc(p[index],(w+1)*sizeof(char));
if(temp==NULL){
printf("memory failn");
break;
}
p[index]=temp;
temp=NULL;
*(p[index]+(w-1))=c;
*(p[index]+w)='';
}
w++;
}
printf("%pn", p[index]);
w=1;
index++;
printf("eixt or continue?y:n--");
char ex=0;
scanf("%c",&ex);
if(ex=='n'){
break;
}
getchar();
}
printf("%dn", index);

while((--index)>=0){
printf("%d:%s--%pn", index,p[index],p[index]);
if(p[index]!=NULL){
free(p[index]);
}
p[index]=NULL;
}
free(p);
p=NULL;

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文