【发布时间】:2013-02-08 05:47:25
【问题描述】:
所以我有一个函数,它接受一个指向“字符串”数组的指针(我将字符串理解为只是后面跟着“\0”的内存块)。由于字符串已经是指向字符串第一个字节的指针,所以我的指针实际上是一个** doublePointer。但是,我对 Ying Yang 进行了分段故障,老实说,我不知道在低级别视图中发生了什么。这是我下面的代码,它的功能是读取字符并将第一个单词的首字母大写(在字符串中)和一个句点之后。
void autocaps(char ** words)
{
/* Add code here */
//Period Boolean
bool next=false;
//First Word Boolean
bool fcap=true;
//Counter Variable
int i=0;
int j=0;
//Second Pointer
char** wordx = words;
//LowerCase Bomb & Period Flagging
while(wordx[i][j]!='\0'){
while(wordx[i][j]!='\0'){
//A-Z Filter
if((wordx[i][j]>='A')&&(wordx[i][j]<='Z')){
wordx[i][j]+=32;
}
if(wordx[i][j]=='.'){
next=true;
}
j++;
}
i++;
}
i=0;
j=0;
//Cap First Word & Cap Post Period
while(words[i]!='\0'){
while(words[i][j]!='\0'){
//a-z Filter
if((words[i][j]>=97)&&(words[i][j]<=122)){
if(fcap){
words[i][j]-=32;
fcap=false;
}
if(next){
words[i][j]-=32;
}
}
j++;
}
i++;
}
return;
}
打印通过参数传递的原始指针时出现段错误。如果有人可以向我解释这个的低级概念,因为我很困惑,我到处乱扔三颗星和四颗星,我什至不知道它是否让我离调试代码更近或更远。
谢谢!!
【问题讨论】:
-
不能说重复,但this 应该会有所帮助。
-
*wordx++迭代字符串,但你从不迭代字符,所以**wordsx!='\0'只会在你传递一个空字符串时为假,这可能不是你想要的。 -
所有这一切都取决于您是否实际上首先将 char ** 传递给函数。如果没有这个调用的调用方,就这个问题的答案而言,它是未定义的。此外,您不会传递任何长度的序列。除非您对退出点条件使用尾空指针(我没有看到任何证据),否则这可能会很快向南。提示:如果你传入了一个 char[N][M] 变量,那么你就做错了错误。请更新问题以包含您如何调用此事物的调用方示例。
标签: c pointers segmentation-fault