gpt4 book ai didi

c - 自由的();和 malloc();不断崩溃(C)

转载 作者:太空宇宙 更新时间:2023-11-04 00:44:22 26 4
gpt4 key购买 nike

我编写这段代码是为了练习指针,程序一直崩溃。当我输入一个大数字到counter时,它似乎崩溃了。 1-5 显然不会影响它,但是当您输入 30 时,它会不断崩溃,有时是在分配本身 malloc(... 上,有时是在 free(names[i]) ; 函数。

这里有什么问题?

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>


int main() {
char **names;
char buffer[100];
int i, bufferLen, counter;

printf("how many names? ");
scanf_s("%d", &counter);
if (counter < 0) {
printf("wrong choice\n");
return 1;
}

names = (char**)malloc(77 * sizeof(char));
if (names == NULL) {
printf("failed...\n");
return 1;
}

for (i = 0; i < counter; i++) {
printf("write the name!! (up to 100 chars): \n");
gets_s(buffer, sizeof(char) * 100);
bufferLen = strlen(buffer) + 1;
names[i] = (char*)malloc(sizeof(char)*bufferLen);
if (names[i] == NULL) {
printf("failed...\n");
return 1;
}
strcpy_s(names[i], sizeof(char)*bufferLen, buffer);
}

for (i = counter-1; i >= 0; i--) { //print names
printf("no. %d, ptr no. %d (size: %d bytes): \n", i+1, (int)(names[i]), sizeof(names[i]));
puts(names[i]);
}
for (i = 0; i < counter; i++) {
if (names[i] != NULL)
free(names[i]);
}
if (names != NULL)
free(names);
return 0;
}

最佳答案

这个:

names = (char**)malloc(77 * sizeof(char));

是错误的,sizeof (char) 是 1 这不是你想要的。

应该是:

names = malloc(77 * sizeof *names);

这与 77 * sizeof (char *) 相同,因为 nameschar ** 这使得 的类型*nameschar *

转换不是必需的,在我看来应该省略。

当然,对于数组长度使用文字 77 而不是 count 是非常奇怪的(并且有明显的代码味道)。

关于c - 自由的();和 malloc();不断崩溃(C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49131140/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com