Run-time error: *** glibc detected ***
Run-time error: *** glibc detected ***
我正在尝试一些随机的事情,以便更多地了解 malloc、realloc 和 free 以及它们一起使用时的行为方式。
我将包含代码和我的想法。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
char *str;
/* Initial memory allocation */
str = (char *) malloc(15);
strcpy(str, "63tczfqV4nqB2YnH9iFJbGvGyyDkvK341rrj0G0mo1PEYniOVHejVIFIQnJzHSSMRbuyGMCZ4M5HFMV4y1q4QgYqyxp2XkTjxaolKTkaw1r25S2Emz061tw1");
printf("String = %s, Address = %u\n", str, *str);
/* Reallocating memory */
str = (char *) realloc(str,16);
strcat(str, "12345678");
printf("String = %s, Address = %u\n", str, *str);
free(str);
return 0;
}
我希望我的代码表现得像这样:
- 我使用 malloc 创建了一个指向(最多)15 字节内存的字符型内存指针。
- 使用那个字符指针,我使用 strcpy 保存了 120 个字符。
- 我将我的字符指针调整为现在指向(最多)16 个字节。
- 我使用 strcat 将另外 8 个字符连接到已经包含 120 个字符的内存缓冲区。
- 现在,我的字符指针应该指向 128 个字符,我试图重现它,但是,它失败了 128 个字符(但打印了之前使用 strcpy 保存的 120 个字符)。
确切的错误是:
***** glibc detected *** ./a.out: realloc(): invalid next size: 0x0000000001690010 *****
并且控制台挂在这个上面,也就是说,它从未移动过我想的 realloc 行?
让我们看一下您代码的前两行:
str = (char *) malloc(15);
strcpy(str, "63tczfqV4nqB2YnH9iFJbGvGyyDkvK341rrj0G0mo1PEYniOVHejVIFIQnJzHSSMRbuyGMCZ4M5HFMV4y1q4QgYqyxp2XkTjxaolKTkaw1r25S2Emz061tw1");
至此,你已经打破了C语言的规则。 strcpy
将写入到 str
的末尾,这会导致未定义的行为。
这一点之后发生的一切都悬而未决。
我正在尝试一些随机的事情,以便更多地了解 malloc、realloc 和 free 以及它们一起使用时的行为方式。
我将包含代码和我的想法。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
char *str;
/* Initial memory allocation */
str = (char *) malloc(15);
strcpy(str, "63tczfqV4nqB2YnH9iFJbGvGyyDkvK341rrj0G0mo1PEYniOVHejVIFIQnJzHSSMRbuyGMCZ4M5HFMV4y1q4QgYqyxp2XkTjxaolKTkaw1r25S2Emz061tw1");
printf("String = %s, Address = %u\n", str, *str);
/* Reallocating memory */
str = (char *) realloc(str,16);
strcat(str, "12345678");
printf("String = %s, Address = %u\n", str, *str);
free(str);
return 0;
}
我希望我的代码表现得像这样:
- 我使用 malloc 创建了一个指向(最多)15 字节内存的字符型内存指针。
- 使用那个字符指针,我使用 strcpy 保存了 120 个字符。
- 我将我的字符指针调整为现在指向(最多)16 个字节。
- 我使用 strcat 将另外 8 个字符连接到已经包含 120 个字符的内存缓冲区。
- 现在,我的字符指针应该指向 128 个字符,我试图重现它,但是,它失败了 128 个字符(但打印了之前使用 strcpy 保存的 120 个字符)。
确切的错误是:
***** glibc detected *** ./a.out: realloc(): invalid next size: 0x0000000001690010 *****
并且控制台挂在这个上面,也就是说,它从未移动过我想的 realloc 行?
让我们看一下您代码的前两行:
str = (char *) malloc(15);
strcpy(str, "63tczfqV4nqB2YnH9iFJbGvGyyDkvK341rrj0G0mo1PEYniOVHejVIFIQnJzHSSMRbuyGMCZ4M5HFMV4y1q4QgYqyxp2XkTjxaolKTkaw1r25S2Emz061tw1");
至此,你已经打破了C语言的规则。 strcpy
将写入到 str
的末尾,这会导致未定义的行为。
这一点之后发生的一切都悬而未决。