我正在学习C(C ++)中内存分配的基础知识。
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
void main(){
char *str;
char *input;
int *ilist;
int i, size1, size2;
printf("Number of letters in word: ");
scanf("%d", &size1);
printf("Number of integers: ");
scanf("%d", &size2);
str = (char *)malloc(size1*sizeof(char) + 1);
ilist = (int *)malloc(size2*sizeof(int));
if (str == NULL || ilist == NULL){
printf("Lack of memory");
}
printf("Word: ");
int k = size1;
// the following line is done to prevent memory bugs when the amount of
letters in greater than size1.
scanf("%ks", &str); //I guess something is wrong with this line
/* user inputs a string */
for (i = 0; i < size2; i++) {
printf("Number %d of %d: ", i + 1, size2);
//this scanf is skipped during the execution of the program
scanf("%d", ilist + i);
}
free(str);
free(ilist);
system("pause");
}
程序要求用户写入单词中的字母数量和数字中的位数。然后用户写下这个词。然后他逐个写整数,具体取决于之前键入的数字。我遇到的问题是当用户写入整个单词时,跳过下一个scanf。 谢谢。 附:这段代码中可能有其他类型的内存错误吗?
答案 0 :(得分:2)
关于 //我猜这条线路有问题 ...
"%ks"
中的格式说明符scanf("%ks", &str);
包含k,它不是有效的 scanf() format specifier 。
对于width
说明符中的用户输入值,您可以创建格式缓冲区:
char format[10];
int k = size1;//assume size1 == 10
sprintf(format, "%c%d%c", '%', k, 's');
//assuming k == 10, format contains "%10s"
scanf(format, &str); //now, there is nothing wrong with this line
其他观察
有 several recommended prototypes for the C main function 。 void main()
不是其中之一。
此行 :str = (char *)malloc(size1*sizeof(char) + 1);
可以写成:
str = malloc(size1 + 1); //removed sizeof(char) as it is always 1
//removed cast, not recommended in C
类似于 :ilist = (int *)malloc(size2*sizeof(int));
ilist = malloc(size2*sizeof(int));//remove cast, but keep sizeof(int)
//unlike sizeof(char), sizeof(int) is never 1
在C:
中考虑动态内存分配的一些 Basics 1)在C中,不要转换 calloc(), malloc() or realloc() 的输出。 (但是用C ++演员。)
2)对于 calloc(),malloc()或realloc()的每次调用,必须对 free() 进行相应的调用。
3)虽然自动内存来自 stack ,但动态内存来自 heap
4)如果 speed efficiency is important ,请在堆上支持堆栈。
答案 1 :(得分:1)
而不是使用scanf
使用fgets
。但是,您需要首先清除输入缓冲区以消耗先前\n
s留下的scanf
。
int c;
while((c = getchar()) != '\n' && c != EOF); // Clear input buffer
fgets(str, k, stdin);
请注意,如果读取'\n'
,则会将其存储在str
中。你应该照顾好。