0

I'm trying to understand why an issue is happening. I have a file, from which I read several lines:

char *array_slave[128];

int i = 0;
while ((read = getline(&line, &len, fp)) != -1)
{
    if (strstr(line, "X") != NULL)
    {
        array_slave[i] = line;
        printf("%s\n",array_slave[i]);
        i++;
    }
}

After this cycle, I know that array_slave contains 32 lines:

size_t array_length(char *ptr[])
{
    size_t i=0;
    while(ptr[i]!=NULL){
        //printf("%d\n", i);
        //printf("%s\n",ptr[i]);
        i++;
    }
    return i;

}

Now, I simply want to print the last 4 elements of array_slave. Anyway, I noticed that it prints always the same line:

for(int i=0; i<10;i++){
    printf("%s\n", array_slave[i]);
}

I think that this happens because, in the first cycle, the i++ operation shifts the pointer, so now it is in a memory address that is not of my interest. How can I return the original position of array_slave? I want to point to array_slave[0], array_slave[1] and so on...

0

4 Answers 4

2

Because they are both pointing to same line. array_slave[i] = line; stores the same address at the ith location for each i. The memory pointed by line is overwritten with new content each time. You should copy the contents of line to a new place and store the address of that place in the array_slave array.

Sign up to request clarification or add additional context in comments.

1 Comment

To be noted, too: Unless re-allocation occurs because of previous line being too short – in which case the pointers stored previously get invlidated!
1

Alternatively to the solution proposed by the previous answers the problem could also be solved by setting line to NULL after copying the pointer to slave_array:

char *array_slave[128];

int i = 0;
while ((read = getline(&line, &len, fp)) != -1)
{
    if (strstr(line, "X") != NULL)
    {
        array_slave[i] = line;
        line = NULL;  // HERE
        printf("%s\n",array_slave[i]);
        i++;
    }
}

That will cause getline() to malloc() a new buffer when it's called the next time. Be aware you have to free() each array_slave[i] when you don't need it anymore.

Comments

1

After this cicle, I know that array_slave contains 32 lines

That is not entirely accurate, it contains 32 pointers to char that will all point to1 the address of line, which is in itself a pointer to char that will be pointing to a unique memory location, it will not change where it's pointing to along the loop, what will change is what is stored in that memory location, which is the read line in that particular iteration.


So with the above information you can see that the pointers stored in array_slave will all point to line and print whatever is in there, repeatedly in your cycle, and what line contains2 is the last line you read from the file.

What you need to do is to copy the content of line to array_slave[i] in each iteration:

//...
if (strstr(line, "X") != NULL)
{
    strcpy(array_slave[i], line); //<---
    printf("%s\n",array_slave[i]);
    i++;
}
//...

1 - Contain the address of
2 - Points to

Comments

0

Adding (lately, for late readers) yet another approach: Just skip this intermediate variable line entirely and read into the array directly; for this purpose, it must be initialised appropriately, though:

char *array_slave[128] = { NULL };

which then allows reading the lines as

getline(array_slave + i, &len, fp)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.