使用C中的指针打印数组时出现问题

时间:2017-01-27 11:18:33

标签: c arrays pointers

我是指针的新手,我正在尝试实现一个简单的代码,我在其中读取和写入一个数组,并且我还搜索两个给定索引之间的最小元素。 由于某种原因,write()函数打印大值(我猜它们是存储值的位置)。我运行poz_minVal函数时也会收到SIGSECV。 我知道这是一个不起眼的问题,但任何帮助都会非常感激!

代码如下:

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

int read(int *v, FILE *f){
    int i,length;
    fscanf(f,"%d",&length);
    v = (int *)malloc(length*sizeof(int));
    for(i=0;i<length;++i)
        fscanf(f,"%d",v+i);
    return length;
}

void write(int *v, int length, FILE *g){
    int i;
    for(i=0;i<length;++i)
        fprintf(g,"%d ",*(v+i));
    fprintf(g,"\n\n");
}

int poz_valMin(int *v, int length,int left,int right){
    int k,mini = *v; //set mini as the 1st element in v
    for(k=left;k<right;++k)
        if(*(v+k) < mini)
            mini = *(v+k);
    return mini;
}

int main(){
    FILE *f = fopen("datein.txt","r");
    FILE *g = fopen("dateout.txt","w");
    int *v, n = read(v,f);
    write(v,n,g);
    fprintf("The minimum value between the indexes 2 and 4 is: %d.\n\n",poz_valMin(v,n,2,4));
    return 0;
}

4 个答案:

答案 0 :(得分:3)

无论barak manos所说的是对的,但让我指出另一种定义读取功能的方法。

int * read(FILE *f){
   int *v,length;
   fscanf(f,"%d",&length);
   v = (int *)malloc(length*sizeof(int));
   for(i=0;i<length;++i)
       fscanf(f,"%d",v+i);
   return v;
}


然后在主要你应该写v = read(f);
这看起来很干净,简化了理解。

提示:
一旦你发现写入产生垃圾,你应该打印出数组v,你可能已经发现了错误!!

答案 1 :(得分:2)

功能read应该int** v,并指定*v = ...

更改函数内的输入参数不会影响函数外部的参数值。

答案 2 :(得分:1)

//int read(int *v, FILE *f) //<-- in this case v will be treated as local variable inside read() and not the parameter passed from main.
int read(int **v, FILE *f)
{
    int i,length;
    fscanf(f,"%d",&length);
    //v = (int *)malloc(length*sizeof(int));
    int *arr = (int *)malloc(length*sizeof(int));
    for(i=0;i<length;++i)
        //fscanf(f,"%d",v+i);
        fscanf(f,"%d",arr+i);

    *v = arr;  //now you are actually assigning the allocated memory to main::v
    return length;
}

read(&v,f);  //call read like this.

答案 3 :(得分:1)

以下代码:

  1. 将评论纳入问题,但良好的变量命名
  2. 除外
  3. 干净地编译
  4. 执行所需的操作
  5. 执行适当的错误检查
  6. 你应养成使用main()函数(在那些具有main()函数的文件中)作为列出的第一个函数的习惯,然后对每个函数使用适当的'prototype'语句子功能

    建议使用size_t来表示绝对不能为负的值。

    #include <stdio.h>  // fopen(), fclose(),
    #include <stdlib.h>
    
    size_t read(       int **v, FILE *f);
    void   write(      int *v, size_t length, FILE *g );
    int    poz_valMin( int *v, int left, int right );
    
    
    int main( void )
    {
        FILE *f = fopen("datein.txt","r");
        if( !f )
        {
            perror( "fopen for read of datain.txt failed" );
            exit( EXIT_FAILURE );
        }
    
        // implied else, fopen successful
    
        FILE *g = fopen("dateout.txt","w");
        if( !g )
        {
            perror( "fopen for write to dataout.txt failed" );
            fclose( f ); // cleanup
            exit( EXIT_FAILURE );
        }
    
        // implied else, fopen for output successful
    
        int *v;
        size_t n = read(&v,f);
    
        write(v,n,g);
        fprintf( stdout,
                 "The minimum value between the indexes 2 and 4 is: %d.\n\n",
                 poz_valMin(v, 2, 4));
    
        free( v );
        fclose( f );
        fclose( g );
    }
    
    
    
    size_t read(int **v, FILE *f)
    {
        //int i;
        size_t length;
    
        if( 1 != fscanf(f,"%lu",&length) )
        {
            perror( "fscanf failed" );
            exit( EXIT_FAILURE );
        }
    
        // implied else, fscanf successful
    
        *v = malloc(length*sizeof(int));
        if( !v )
        {
            perror( "malloc failed" );
            fclose( f );
            exit( EXIT_FAILURE );
        }
    
        // implied else, malloc successful
    
        for(size_t i=0; i<length; ++i)
        {
            if( 1 != fscanf(f,"%d",(*v)+i) )
            {
                perror( "fscanf for array values failed" );
                free( *v );
                fclose( f );
                exit( EXIT_FAILURE );
            }
    
            // implied else, fscanf successful
        }
    
        return length;
    }
    
    
    void write(int *v, size_t length, FILE *g)
    {
        //int i;
    
        for( size_t i=0; i<length; ++i )
            fprintf(g,"%d ",*(v+i));
    
        fprintf(g,"\n\n");
    }
    
    
    int poz_valMin( int *v, int left, int right )
    {
        int k;
        int mini = *v; //set mini as the 1st element in v
    
        for(k=left; k<right; ++k)
            if(*(v+k) < mini)
                mini = *(v+k);
    
        return mini;
    }