Alexander Huang
Alexander Huang

Reputation: 1

typedef memory allocation

VARIABLES AREN'T SET IN STONE YET! Excuse if if no indention. I am new to this site. Anyway, I have a text document of a list of games in five different categories, and I need to some help with memory allocation VIA typedef. How would one do it? So far, this is what I have:

/* 
Example of text document

2012 DotA PC 0.00 10
2011 Gran Turismo 5 PS3 60.00 12
list continues in similar fashion...
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//function prototype here

char **readFile(char *file);
char *allocateString(char temp[]);

typedef struct
{
    int year;
    char name[100];
    char system[10];
    float price;
    int players;
}game;


int main(void)
{
char **list;

system("pause");
return 0;
}

//function defined here
char **readFile(char *file) //reads file and and allocates
{ 
FILE* fpIn;
    int i, total=0;


    fpIn = fopen("list.txt", "r");
    if (!fpIn)
    {
        printf("File does not exist");
        exit(101);
    }

/*
allocate memory by row here VIA for loop with the total++ to keep track of the 
number of games
*/
/*
allocate memory individually for each item VIA "allocateString by using going 
to set list[i] = allocateStrng(tmpList) using for loop the for loop will have
for (i=0; i<total; i++)
*/

return;
}

//allocateString here
char *allocateString(char temp[]);
{
char *s;

s = (char*)calloc(strlen(temp+1), sizeof(char)));
strcpy(s, temp);

return s;
}

Upvotes: 0

Views: 1057

Answers (2)

knockoutrose
knockoutrose

Reputation: 11

s = (char*)calloc(strlen(temp+1), sizeof(char)));

//the name of the array is a pointer, so you are doing pointer arithmetic.  
//I think you want strlen(*temp+1, sizeof(char)));
 // or strlen(temmp[1]) it isn't clear if this is a pointer to a string or an array 
 // of strings
//you need the length of the string *temp is the content which temp points to

//strcpy(s, temp);

Upvotes: 0

MvG
MvG

Reputation: 60868

Usually you'd allocate a decent amount of memory up front, detect situations where that amount is not enough, and enlarge the allocation in those cases using realloc (or malloc followed by memcpy and free). This advice holds for both the buffer into which you read the current line (to be passed as temp to allocateString) and the array to hold the sequence of all lines.

You can detect an insufficient buffer size for the line buffer when after calling fgets(buf, bufsize, fpIn) the strlen(buf) == bufsize - 1 but still buf[bufsize - 2] != '\n'. In other words, when reading filled the whole buffer, but still didn't reach a newline. In that case, the next read will continue the current line. You might want an inner loop to extend the buffer and read again for as long as it takes.

Note that your allocateString pretty much duplicates strdup, so you might want to use that instead.

The links in the above text mainly come from the manual of the GNU C library. cppreference.com is another good source of C function documentation. As are the Linux man pages.

Upvotes: 2

Related Questions