C:0x0FFB0BA0抛出异常(ucrtbased.dll)

时间:2016-11-28 22:56:38

标签: c arrays memory

我正在制作一个程序,要求用户输入一个单词以及用户想从该单词复制的字母数。当我使用Compile Online时程序可以工作,但是当我在Micrsoft Visual Studio中运行程序时,程序在我输入要复制的单词后冻结。我运行调试器,发现下面显示的错误。我接受它,from googling,我正在写出为阵列留出的内存量?我应该使用malloc来解决这个问题吗?以下是错误和代码(链接到原始stackoverflow thread

lab1113problem7.exe中的0x0FFB0BA0(ucrtbased.dll)抛出异常:0xC0000005:访问冲突写入位置0x00B80000。

lab1113problem7.exe中0xFEFEFEFE处的未处理异常:0xC00001A5:检测到无效的异常处理程序例程(参数:0x00000003)。

程序'[7196] lab1113problem7.exe'已退出,代码为0(0x0)。

程序:

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

char *copywords(char *dest, const char *source, size_t n);

int main(void) {
    char words[50];
    char newwords[50];
    int num;

    for (;;) {
        printf("Type a word, or type 'quit' to quit: ");
        if (scanf("%49s", words) != 1) {
            printf("Invalid input!\n");
            return 0; 
        }
        if (!strcmp(words, "quit")) {
            printf("Good bye!\n");
            return 0; 
        }
        printf("Type the # of chars to copy: ");
         if (scanf("%d", &num) != 1) {
            printf("Invalid input!\n");
            return 0; 
        }
        copywords(newwords, words, num);
        printf("The word was %s\n", words);
        printf("and the copied word is %s\n", newwords);
    }
}

char *copywords(char *dest, const char *source, size_t n) {
    size_t i;
    for (i = 0; i < n && source[i] != '\0'; i++) {
        dest[i] = source[i];
    }
    dest[i] = '\0';
    return dest;
}

1 个答案:

答案 0 :(得分:0)

一些调试代码,以确保事情按照预期的字符串工作:

// Place this at the top of your file, after your `#include` statements 
// and use it in place of the 50s in your array defines.
#define MAX_ARRAY_SIZE 50

char *copywords(char *dest, const char *source, size_t n) {
    size_t i;
    for (i = 0; i < n && source[i] != '\0'; i++) {
        if(i >= MAX_ARRAY_SIZE)
        {
            printf("I just blew up memory at %i\n", %i);
        }
        dest[i] = source[i];
    }
    dest[i] = '\0';
    return dest;
}

注意:您可以在for循环中检查每次迭代的数组大小,以确保没有超出缓冲区。

不是直接的答案,而是比使用评论更容易尝试。如果printf被触发,你就知道发生了不好的事情......

更好的是,因为你传递的大小为n,你可以在每次启动循环之前检查数组大小并立即处理坏数据。

char *copywords(char *dest, const char *source, size_t n) {
    if(n >= MAX_ARRAY_SIZE) 
    {
        printf("Array will overflow by %d bytes- truncating\n", n - MAX_ARRAY_SIZE);
        n = MAX_ARRAY_SIZE;
    }