我的代码没有从下面的函数 zamianaWierszy
返回:
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
void zamianaWierszy(int pierwszy, int drugi,char*tabstat[]) {
char*pamietajPierwszy;
size_t rozmiarTab = strlen(*tabstat);
pamietajPierwszy = tabstat[pierwszy - 1];
tabstat[pierwszy - 1] = tabstat[drugi - 1];
tabstat[drugi - 1] = pamietajPierwszy;
for (int i = 0; i < rozmiarTab; i++) {
puts(tabstat[i]);
}
}
int main()
{
int pierwszy, drugi, pusty;
char *tabstat[] = {
(char*)"abcde",
(char*)"fghi",
(char*)"jklmn",
(char*)"koder"
};
printf("Podaj wybrane wiersze,które chcesz przestawić:");
scanf("%d %d", &pierwszy, &drugi);
zamianaWierszy(pierwszy, drugi, tabstat);
printf("Podaj po którym wierszu chcesz wstawić pusty wiersz:");
scanf("%d", &pusty);
pustyWiersz(pusty, tabstat);
return 0;
}
我在 main.c 中没有看到 printf("Podaj po którym wierszu chcesz wstawić pusty wiersz:")
的输出。
最佳答案
您的代码有很多不正确的地方,主要是:
- 检查 scanf 的结果,或者您可能已经初始化了
pierwszy
和drugi
的值 - 如果
pierwszy
为 0 或负数,这将覆盖调用函数的堆栈帧:tabstat[pierwszy - 1] = ...
- 如果
drugi
为 0 或负数,这将覆盖调用函数的堆栈帧:tabstat[drugi - 1] = ...
rozmiarTab
将包含第一个字符串的大小 (5),而不是tabstat
中应有的字符串数量。因此,您的 for 循环将访问额外的超出范围的项目。但是,这可能会打印一些垃圾或崩溃,但不太可能影响函数的返回地址。
当覆盖调用者堆栈帧时,您可能会覆盖函数的返回地址,并且没有人知道您的函数可以返回到哪里...:)
因此,您需要检查scanf
的返回值以及pierwszy
和drugi
的值,并修复的值rozmiarTab
.
关于c - 如何从函数 void zamiana Wierszy(...) 返回主函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55534686/