由于指针错误导致的c SEG故障
这是我的代码:由于指针错误导致的c SEG故障,c,function,pointers,C,Function,Pointers,这是我的代码: #include <stdio.h> #include <stdlib.h> void getinfo(unsigned int a, unsigned int b, char **s); int main(){ unsigned int len_max = 8; unsigned int current_size = 0; char *pStr = malloc(len_max); if(pStr == NULL
#include <stdio.h>
#include <stdlib.h>
void getinfo(unsigned int a, unsigned int b, char **s);
int main(){
unsigned int len_max = 8;
unsigned int current_size = 0;
char *pStr = malloc(len_max);
if(pStr == NULL){
perror("\nMemory allocation\n");
return EXIT_FAILURE;
}
current_size = len_max;
printf("Inserisci hostname: ");
getinfo(len_max, current_size, &pStr);
printf("\nLa stringa inserita è: %s\n", pStr);
free(pStr);
return EXIT_SUCCESS;
}
void getinfo(unsigned int a, unsigned int b, char **pStr){
unsigned int i = 0;
char c = EOF;
while((c = getchar()) != '\n'){
*pStr[i++] = (char)c;
if(i == b){
b = i+a;
if((*pStr = realloc(*pStr, b)) == NULL){
perror("\nMemory allocation error\n");
exit(EXIT_FAILURE);
}
}
}
*pStr[i]='\0';
}
当我执行这段代码时,当我在编写字符串后按enter键时,我遇到了一个分段错误。
我确定问题出在函数中可能是*s指针的问题,但我不知道如何更正它…您有一个优先级问题。你需要使用
(*s)[i++] = ...
而不是
*s[i++] = ...
同样地,你需要
(*s)[i]='\0';
当你写*s[i]时,你是在索引s。但是您需要索引*s,因此需要括号
我没有检查其余的代码,但如果确实有更多错误,我希望这能帮助您调试其余的代码。您有一个优先级问题。你需要使用
(*s)[i++] = ...
而不是
*s[i++] = ...
同样地,你需要
(*s)[i]='\0';
当你写*s[i]时,你是在索引s。但是您需要索引*s,因此需要括号
我还没有检查其余的代码,但如果确实有更多错误,我希望这能帮助您调试其余的代码。问题在于*s[I++]=charc;尝试将其转换为*s[i++]=charc;用括号括起*s。以及*s[i]='\0.问题在于*s[i++]=charc;尝试将其转换为*s[i++]=charc;用括号括起*s。以及*s[i]='\0'。旁注:getchar返回int&非char。你应该考虑把C换成一个字:谢谢,我纠正了错误!旁注:getchar返回int&非char。你应该考虑把C换成一个字:谢谢:我纠正了错误!是的,我想你可能是对的。我自己会尝试封装向字符串添加额外字符的方法,而不是让它与循环纠缠在一起。@polslinux是的,我认为你可能是对的。我自己会尝试封装向字符串添加额外字符的方法,而不是让它与循环纠缠在一起。我不这么认为。当缓冲区满时,您总是扩展它。所以总有空间再容纳一个角色。@Totaldowner:不,等等……你确定吗?因为我已经完成了i++的运算,所以我将下一个i与b进行比较!我不把我和实际情况作比较:我不这么认为。当缓冲区满时,您总是扩展它。所以总有空间再容纳一个角色。@Totaldowner:不,等等……你确定吗?因为我已经完成了i++的运算,所以我将下一个i与b进行比较!我不会将i与实际位置进行比较:D