Die*_*les 0 c segmentation-fault
所以我的兄弟正在制作一个程序,将字符串中的所有单词转换为主题标签,但由于某种原因,它总是在执行结束时出现"分段错误"错误.我试图找到可能导致它的原因,但还没有找到.这是代码:
#include <stdio.h>
#include <string.h>
char* setHashtag(char text[10000])
{
int i, j;
printf("Initial text = %s\n", text);
for (i = 9998; i >= 0; i--)
{
text[i+1] = text[i];
}
text[0] = ' ';
for (i = 0; text[i+1] != '\0'; i++)
{
if(text[i] == ' ' && text[i+1] != ' ')
{
for (j = 9998; j > i; j--)
{
text[j+1] = text[j];
}
text[i+1] = '#';
printf("Partial text = %s\n", text);
}
}
return text;
}
void execute() {
char text[5000], textFinal[10000];
gets(text);
strcpy(textFinal, setHashtag(text));
printf("%s\n", textFinal);
}
int main()
{
execute();
printf("Back to main\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
您将一个大小的数组传递5000给您的函数,但您可以访问其中的10000元素.当然,它会崩溃.
函数声明中指定的数组大小无关紧要.它被编译器忽略.这个
char* setHashtag(char text[10000])
Run Code Online (Sandbox Code Playgroud)
相当于此
char* setHashtag(char *text)
Run Code Online (Sandbox Code Playgroud)
即函数接收指向原始参数数组开头的指针,而不是参数数组的新本地副本(C中的裸数组不可复制).
这意味着当你调用你的函数时
char text[5000];
...
setHashtag(text)
Run Code Online (Sandbox Code Playgroud)
所述text阵列不奇迹般地成为char [10000]阵列.它仍然是一个char [5000]数组,因为它最初是声明的.尝试访问text[9998]函数内部会导致未定义的行为.
由于您的setHashtag函数需要一个固定大小的数组10000,因此将函数声明为更好
char* setHashtag(char (*text)[10000])
Run Code Online (Sandbox Code Playgroud)
并传入数组参数为setHashing(&text).这将确保您无法传入错误大小的数组.在函数内部,你必须访问数组(*text)[i].
| 归档时间: |
|
| 查看次数: |
156 次 |
| 最近记录: |