[550] Re:reallocについて
投稿者:本多
2007/02/20 02:13:25
こんな感じかなぁ?
要素追加しちゃったけど。
----
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
int itemCount;
char cString[50];
char **cpItem;
} typChangePrm;
typChangePrm *CreatePrm( char *cString, int itemCount)
{
typChangePrm *prm = NULL;
int i;
if ( (prm = malloc( sizeof( typChangePrm))) == NULL) {
fprintf(stderr,"ERROR: memory allocation\n");
goto LERROR;
}
if ( strlen( cString) >= 50 ) return NULL;
strcpy( prm->cString, cString);
prm->itemCount = itemCount;
if ( (prm->cpItem = malloc( sizeof(char *) * itemCount )) == NULL) {
fprintf(stderr,"ERROR: memory allocation\n");
goto LERROR;
}
for ( i=0; i<itemCount; i++) prm->cpItem[i] = NULL;
return prm;
LERROR:
free( prm->cpItem);
free( prm);
return NULL;
}
void PrmDestroy( typChangePrm *prm)
{
int i;
for ( i=0; i<prm->itemCount; i++)
free(prm->cpItem);
free(prm->cpItem);
free(prm);
}
void PrmResize( typChangePrm *prm, int itemCount)
{
char **tmp;
int i;
if ( prm->itemCount >= itemCount ) {
for ( i=itemCount; prm->i<itemCount; i++)
free( prm->cpItem[i]);
prm->itemCount = itemCount;
return;
}
tmp = prm->cpItem;
if ( (tmp = realloc( tmp, sizeof(char *) * itemCount)) == NULL) {
fprintf(stderr,"ERROR: memory allocation\n");
goto LERROR;
}
prm->cpItem = tmp;
for ( i=prm->itemCount; i<itemCount; i++) prm->cpItem[i] = NULL;
prm->itemCount = itemCount;
return;
LERROR:
free( prm->cpItem);
}
void PrmSetItem( typChangePrm *prm, int item_no, char *item)
{
if ( item_no >= prm->itemCount) return;
if ( (prm->cpItem[ item_no] = strdup( item)) == NULL)
fprintf(stderr,"ERROR:memory allocation\n");
}
void PrmShow( typChangePrm *prm)
{
int i;
printf("********************************\n");
printf("Item Count:%d\n",prm->itemCount);
printf("cString :%s\n",prm->cString);
for ( i=0; i<prm->itemCount; i++)
printf("Item[%d]:%s\n",i,((prm->cpItem[i]==NULL)?"NULL":prm->cpItem[i]));
}
int main(void)
{
typChangePrm *prm;
char *item[] = { "hello", "world", "program"};
if ( (prm = CreatePrm("c-string",2)) == NULL) return 1;
PrmSetItem(prm,0,item[0]);
PrmSetItem(prm,1,item[1]);
PrmShow( prm);
PrmResize( prm, 3);
PrmSetItem(prm,2,item[2]);
PrmShow( prm);
PrmResize( prm, 1);
PrmShow( prm);
PrmDestroy(prm);
return 0;
}