我构建了这个代码来练习指针,程序一直在崩溃。当我向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;
}
答案 0 :(得分:4)
此:
names = (char**)malloc(77 * sizeof(char));
错误,sizeof (char)
为1,这不是您想要的。
应该是:
names = malloc(77 * sizeof *names);
这与77 * sizeof (char *)
相同,因为names
为char **
,*names
的类型为char *
。
演员没有必要,我认为应该省略。
当然,使用文字77
代替count
非常奇怪(以及明显的代码气味)。
答案 1 :(得分:2)
您可能想要names = (char**)malloc(counter * sizeof(char*));
。
此外free
处理空指针,在调用之前无需检查指针是否为空。