?
Solved

strcpy() or malloc() problem !!

Posted on 2002-04-08
3
Medium Priority
?
794 Views
Last Modified: 2012-08-13
hi,
i have to tried to create a program which should display n last line from a file specified at command line. here is the code (i called it mylast.c)

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

#define DEFAULT 5

/* This program has a Segmentation Fault error when running
   with -33 or greater lastfile and not when n < 33.
*/

int main(int argc, char **argv)
{
        if (argc<2 || argc>3) {
                printf("Usage: last [-n] <filename>\n");
                exit(1);
        }
        int line;
        char *filename;

if (argc == 2) {
                line = DEFAULT;
                filename = argv[1];
        } else {
                if (argv[1][0] == '-') {
                        line =  atoi(argv[1]) * -1;
                } else {
                        printf("Usage: last [-n] <filename>\n");
                        exit(1);
                }
                filename = argv[2];
                //printf("line = %d, filename = %s\n", line, filename);
        }

        FILE *fp;
        char **abuffer;
        char buffer[100];

        if ((fp = fopen(filename, "rt")) == NULL) {
                fprintf(stderr, "Can't open file %s\n", filename);
                exit(1);
        }

        abuffer = (char **)malloc(line * sizeof(char));
        for (int i=0; i<line; i++)
        {
                abuffer[i] = (char *)malloc(100*sizeof(char));
        }

        /* why we got a Segmentation Fault if line > 32 */
        int x=0;
        while (fgets(buffer, 100, fp) != NULL) {
                for (int j=line-1; j>0; j--) {
                        printf("i is %d\n", j);
                        printf("abuffer[j] = %s, abuffer[j-1] = %s\n", abuffer[j], abuffer[j-1]);
                        strcpy(abuffer[j], abuffer[j-1]);
                }
                x++;
                printf("x is %d\n", x);
                strcpy(abuffer[0], buffer);
                printf("buffer = %s and abuffer[0] = %s\n", buffer, abuffer[0]);
        }

        for (int k=line-1; k>=0; k--) {
                fprintf(stdout, "%s", abuffer[k]);
        }
}
################
i have compiled it without any error
> CC mylast.c -o mylast

i have executed it without any error when it trying to display n last line where n <= 32.
> mylast -32 lastfile    #lastfile just a file containing text to be displayed

BUT when i do,
> mylast -33 lastfile
i have got Segmentation Fault(coreDumped)

Any idea why it happened when line number is > than 32???

lastfile contains:
################
hai my name is robert
how are you
i am fine thanx
are u happy
i am sure u are
dont mad at me

stop making a noise
i am sick of it
i am sure u know that
sleep and dream

orange
apple
######################
0
Comment
Question by:mafendee
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
3 Comments
 
LVL 3

Accepted Solution

by:
marcjb earned 400 total points
ID: 6925427
abuffer = (char **)malloc(line * sizeof(char));

is incorrect

should be

 abuffer = (char **)malloc(line * sizeof(char*));

You are allocating pointers, not charachers.

Hope this helps,

marcjb
0
 

Expert Comment

by:BobGazais
ID: 6930942
marcjb has found your problem, looks like you're
running amok in unallocated memory as soon as
you hit abuffer[4].

Ever heard of the command tail(1) ?

$ tail -33 <filename>
0
 

Author Comment

by:mafendee
ID: 6931650
thanx for the quick answer. I am actually now moving into C/Unix programming.
most probably loads of questions to come and of course i am also quiet generous with points.
0

Featured Post

VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This tutorial is posted by Aaron Wojnowski, administrator at SDKExpert.net.  To view more iPhone tutorials, visit www.sdkexpert.net. This is a very simple tutorial on finding the user's current location easily. In this tutorial, you will learn ho…
This is a short and sweet, but (hopefully) to the point article. There seems to be some fundamental misunderstanding about the function prototype for the "main" function in C and C++, more specifically what type this function should return. I see so…
Video by: Grant
The goal of this video is to provide viewers with basic examples to understand and use for-loops in the C programming language.
Video by: Grant
The goal of this video is to provide viewers with basic examples to understand and use nested-loops in the C programming language.
Suggested Courses
Course of the Month8 days, 18 hours left to enroll

764 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question