- 论坛徽章:
- 0
|
malloc(struct A *)问题
原帖由 "kernelxu" 发表:
sizeof()得不到malloc()请求的存储空间大小,要想知道该大小,就记住你申请的时候是多大就行了。
如果这么说malloc只给malloc_nodeptr_ptr= malloc (sizeof (NODEPTR));分配了4个字节的内存,这个显然是不对的。
#include <stdio.h>;
#include <stdlib.h>;
struct listNode {
char data;
struct listNode * nextPtr;
};
typedef struct listNode LISTNODE;
typedef LISTNODE * LISTNODEPTR;
void insert (LISTNODEPTR *, char);
char delete (LISTNODEPTR *, char);
int isEmpty (LISTNODEPTR);
void printList (LISTNODEPTR);
void instructions (void);
main()
{
LISTNODEPTR startPtr = NULL;
int choice;
char item;
instructions ();
printf ("?" ;
scanf ("%d", &choice);
while ( choice != 3) {
switch (choice) {
case 1:
printf ("Enter acharacter:" ;
scanf ("\n%c", &item);
insert (&startPtr, item);
printList (startPtr);
break;
case 2:
if (!isEmpty(startPtr)) {
printf ("Enter character to be deleted:" ;
scanf ("\n%c", &item);
if (delete (&startPtr, item)) {
printf ("%c deleted.\n",item);
printList (startPtr);
} else
printf ("%c not found.\n\n", item);
} else
printf ("List is empty.\n\n" ;
break;
default:
printf ("Invalid choice.\n\n" ;
instructions ();
break;
}
printf ("?" ;
scanf ("%d", &choice);
}
printf ("End of run. \n" ;
return 0;
}
void instructions (void)
{
printf ("Enter your choice: \n"
"1 to insert a element into the list. \n"
"2 to delete an element from the list. \n"
"3 to end.\n" ;
}
void insert (LISTNODEPTR *sPtr, char value)
{
LISTNODEPTR newPtr, previousPtr, currentPtr;
newPtr = malloc (sizeof (LISTNODEPTR));
if (newPtr != NULL) {
newPtr ->; data = value;
newPtr ->; nextPtr = NULL;
previousPtr = NULL;
currentPtr = *sPtr;
while (currentPtr != NULL && value>;currentPtr->;data) {
previousPtr = currentPtr;
currentPtr = currentPtr ->; nextPtr;
}
if (previousPtr == NULL) {
newPtr->; nextPtr = *sPtr;
*sPtr = newPtr;
}else {
previousPtr->;nextPtr = newPtr;
newPtr ->; nextPtr = currentPtr;
}
} else
printf ("%c not inserted. NO memory available.\n", value);
}
char delete (LISTNODEPTR *sPtr, char value)
{
LISTNODEPTR previousPtr, currentPtr, tempPtr;
if(value == (*sPtr) ->; data) {
tempPtr = *sPtr;
*sPtr = (*sPtr) ->; nextPtr;
free (tempPtr);
return value;
} else {
previousPtr = *sPtr;
currentPtr = (*sPtr) ->; nextPtr;
while (currentPtr != NULL && currentPtr->;data != value) {
previousPtr = currentPtr;
currentPtr = currentPtr ->; nextPtr;
}
if (currentPtr != NULL) {
tempPtr = currentPtr;
previousPtr->;nextPtr = currentPtr ->; nextPtr;
free (tempPtr);
return value;
}
}
return '\0';
}
int isEmpty (LISTNODEPTR sPtr)
{
return sPtr == NULL;
}
void printList (LISTNODEPTR currentPtr)
{
if(currentPtr == NULL)
printf ("List is empty.\n\n" ;
else {
printf ("The list is:\n" ;
while (currentPtr != NULL) {
printf ("%c -->;", currentPtr->;data);
currentPtr = currentPtr->;nextPtr;
}
printf ("NULL.\n\n");
}
}
中的malloc,这个程序确实绝对正确的。
也就是说C(GCC3.3,TC2.0)中有个有意思的地方了(我看了ISO C 99,没有对malloc定义),给malloc()一个sizeof(struct) , sizeof (struct *)是一样的。
大家注意看给两个指针的malloc的参数是不同的。 |
|