我遇到一个问题,即我对malloc()
拨打的电话会导致我的程序崩溃。这是代码:
void update_item(char *input, item_t *new_node){
int i, count, shelf, weight, price, quantity;
char *name;
char *specifier;
char aisle[1];
count = 0;
/*Find name of the new item and assign to the name field of new_node...*/
for (i = 0; input[i] != ','; i++){
count++;
}
name = (char*)malloc((count+1)*sizeof(char));
if (name == NULL){
printf("Out of memory. Shutting down.\n");
exit(EXIT_FAILURE);
}
for (i = 0; input[i] != ','; i++){
name[i] = input[i];
}
name[count+1] = '\0';
new_node->name = name;
printf("%s\n", new_node->name);
/*Find aisle specifier and assign it to aisle field of new_node...*/
i++;
aisle[0] = input[i];
aisle[1] = '\0';
new_node->aisle = aisle;
printf("%s\n", new_node->aisle);
for(i = i+2, count = 0; input[i] != ','; i++){
count++;
}
specifier = (char*)malloc(count*sizeof(char)); /*PROGRAM CRASHES HERE*/
if (specifier == NULL){
printf("Out of memory. Shutting down.\n");
exit(EXIT_FAILURE);
}
printf("boom\n");
我完全难过了。有两个相同的malloc()
来电,但由于某种原因,第二次失败,而第一次总是成功。
答案 0 :(得分:3)
第1点
for (i = 0; input[i] != ','; i++){
不安全。如果您的input
不包含,
,那么您将超越记忆。而是使用像
int len = strlen(input);
for (i = 0; (input[i] != ',') && len ; i++, len--){
第2点
在C
中,我们有基于0
的索引。所以,对于像
name = malloc(count+1);
稍后,做
name[count+1] = '\0';
又是meory overrun,反过来调用undefined behaviour。
注意:
malloc()
C
和sizeof(char)
家人的回复价值do not cast。1
保证在C
aisle
,你可以摆脱它。第3点
根据您的代码,char aisle[1];
定义为
aisle[0] = input[i];
aisle[1] = '\0';
然而,稍后,您使用了
aisle
这又是内存溢出和UB。将您char aisle[2] = {0};
更改为
document.getElementById('MyForm').onchange = function (event) {
event.preventDefault();
switch (myColor) {
case '/':
if (input.value ? '#' + input.value : '#333') {
result = input.value;
}
else {
result = 'Six numbers or letters!';
}
break;
}
document.getElementsByName('result')[0].innerHTML = result;
};
答案 1 :(得分:0)
SEQUENCE :
...
SET :
SEQUENCE :
OBJECT_IDENTIFIER : 'G (2.5.4.42)'
TeletexString : 'YYY'
SEQUENCE :
OBJECT_IDENTIFIER : 'SN (2.5.4.4)'
TeletexString : 'XXX'
SEQUENCE :
OBJECT_IDENTIFIER : 'CN (2.5.4.3)'
PrintableString : '0000'
上面的行应该是
name[count+1] = '\0';
您的代码将导致写入1个未由您分配的额外内存位置。
这些线路也存在问题......
name[count] = '\0'; //one item less