gpt4 book ai didi

c - 访问字符串数组时出现奇怪的段错误

转载 作者:太空宇宙 更新时间:2023-11-04 06:23:39 24 4
gpt4 key购买 nike

不好意思直接贴出我的项目代码。我一直在努力解决这个奇怪的段错误,该错误发生在 for(j=0; j<100 && *nnames[j] != (char *) NULL; j++)。以这种 (*arr[]) 方式访问 char** 数组是否合法?

    char** nnames = getcannames();
char * new_str ;

int j =0, len=0;
////////////////SEG FAULT HERE //////////////////
for(j=0; j<100 && *nnames[j] != (char *) NULL; j++){
len = len + strlen(nnames[j]);

}
if((new_str = (char*) malloc(len + 3)) != NULL){
new_str[0] = '\0'; // ensures the memory is an empty string
int i=0;
//setbuf(client_reply, NULL);
for(i=0; i<7; i++){ //fix this, garbage values after index 68
if(*nnames[i] == (char *) NULL) break;

char *canname = strsave(nnames[i]);


if( (find_newline = strchr( canname, NEWLINE )) != NULL )
*find_newline = EOS;
if(strcmp(canname, "!") != 0){
strcat(new_str, canname);
strcat(new_str, "\n");
}

//strcat(new_str, "\n\n");
}
strcat(new_str,"\n\0");
printf("%s", new_str);
//strcpy( new_str, buf );
buf = new_str;

} else {
perror("malloc failed!\n");
// exit?
}


char** getcannames(){
//INITIALIZE
char *names[100];
int i;
for(i=0; i<100; i++){
names[i] = strsave("\0");
}
int namespos = 0;

struct sym_list *sp;
for( sp = Head.s_next;
sp != (struct sym_list *) NULL;
sp = sp->s_next )
{
if(getcannameindex(names, sp->s_sym.v_value) == -1){
//strcpy(names[namespos++], sp->s_sym.v_name);
names[namespos++] = strsave(sp->s_sym.v_value);
}
}
return names;

}

最佳答案

如果 nnames 是指向类型为 char * 的指针数组的第一个元素的指针,则有效代码如下所示

for ( j = 0; j < 100 && nnames[j] != NULL; j++ ){
len = len + strlen(nnames[j]);

前提是数组的最后一个元素是空指针。

同样适用于语句

if(*nnames[i] == (char *) NULL) break;

那就是它必须像这样重写

if ( nnames[i] == NULL ) break;

还有这个功能

char** getcannames(){
//INITIALIZE
char *names[100];

//...

return names;

}

具有未定义的行为,因为它返回指向局部数组的第一个元素的指针,该元素将在退出函数后被销毁。

考虑到如果函数 strsave 动态创建作为参数传递给它的字符串的副本

char *canname = strsave(nnames[i]);

然后程序有内存泄漏,因为你没有释放 canname。

当然你也可以这样写

strcat(new_str,"\n\0");

甚至喜欢

strcat(new_str,"\n\0\0\0\0");

但是这两个语句等同于

strcat(new_str,"\n");

关于c - 访问字符串数组时出现奇怪的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29965151/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com