Closed. This question is off-topic. It is not currently accepting answers. Learn more
想改进这个问题吗?Update the question所以堆栈溢出的值小于aa>。
两个月前关闭。
我是C新手,我想写一个简单的程序,它接受用户的输入并打印出特定的次数。
#include <stdio.h>
#include <stdlib.h>

int main() {

    char* str[100];
    int *p = malloc(sizeof(int) * 10);
    int amount;
    *p = amount;
    int i;

    printf("\nType anything!\n");
    scanf("%s", str);
    printf("\nHow many times?\n");
    scanf("%d", amount);
    for (i=0; i<=amount; i++) {
         printf("%s", str);
    }
   return 0;
}


它工作正常,直到按下输入次数后,当程序崩溃时,鱼壳显示“Fish:”/a.out“终止于信号SIGSEGV(地址边界错误)”。
地址边界错误告诉我,也许我还没有为某个东西分配内存,但是我该怎么做呢?我试过使用malloc,指针指向amount,但似乎没有解决任何问题。

最佳答案

值得注意的是,在这么短的代码块中有多少问题:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char str[100];
    int amount;

    printf("\nType any word!\n");
    if (scanf("%99s", str) != 1)
    {
        fprintf(stderr, "Failed to read a string\n");
        return(EXIT_FAILURE);
    }
    printf("\nHow many times?\n");
    if (scanf("%d", &amount) != 1)
    {
        fprintf(stderr, "Failed to read an integer\n");
        return(EXIT_FAILURE);
    }
    for (int i = 0; i < amount; i++)
    {
         printf("%s\n", str);
    }
    return 0;
}

main()的签名是一个完整的原型。
str的类型被更正(或者,至少,被更改并可用)。
不需要与pmalloc()相关的代码。
变量i被移动到for循环中(假设有一个C99或更高版本的编译器;如果不可用,那么您所拥有的就可以了)。
将“anything”改为“any word”,因为%s跳过空白,然后将非空格读到下一个空白。
限制输入量以防止溢出。
报告是否有问题读取字符串并退出。
固定scanf()以通过&amount(键更改)。
检查成功阅读amount并报告失败并退出。
定义i在回路控制(C99)。
如果用户请求一个副本,则只打印一个副本(将<=更改为<-这是一个惯用的C循环)。
在每个单词后输出换行符。还有其他方法来表示数据,包括最初选择的数据,但至少应该用换行符结束输出。

关于c - 如何解决C语言中的地址边界错误? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57796816/

10-11 18:24