2016-02-12 68 views
-2

我刚刚开始学习C代码,我已经给出了一个练习来创建两个函数,您可以在我的代码中看到createData()udskriv(),其中createData应该创建一个数组使用用户输入,并且udskriv方法应该使用指针来打印它。C:通过指针打印数组给出错误的数字

但是,我的代码只给了我1或2的正确数字,然后通常打印时为0和一个非常高的数字(如10位数字)。通过运行main方法中的循环,我能够通过无功能的方式实现它,但我无法使它与它们一起工作。

我有一些Java的经验,这可能会帮助你解释为什么我做错了什么。

#include <stdio.h> 

static int* createData() 
{ 
    int test[4]; 
    int c; 
    int *ptr; 

    printf("Indtast 4 tal, 1 af gangen"); 
    for (c = 0; c < 4; c++) 
    { 
     scanf("%d", &test[c]);  
    } 

    ptr=&test; 
    return (ptr); 
} 

static void udskriv(int* ptr) 
{ 
    int i; 
    for (i=0;i<4;i++) 
    { 
     printf("%d\n",*ptr++); 
    } 
} 

int main(void) 
{ 
    udskriv(createData()); 
} 
+0

你在看哪本书?你无法通过反复试验来学习C;这样做可能具有误导性和危险性,而且您这样做是错误的这一事实应该证明试验和错误不起作用。你注意到这个问题其实是一个好结果;很多时候,人们在通过反复试验学习时都没有注意到问题。如果你还没有书,我可以为你推荐K&R 2E。 – Sebivor

+0

btw他是对的:_我对Java有一些经验_解释他的错:___不像Java__那样使用C!他们使用完全不同的数据处理! – LittleByBlue

回答

2

您正在返回一个指向本地数据的指针。函数createData中的变量test是一个局部变量,其技术上称为“存储类自动”。当函数返回时,用于test的内存可能用于其他目的。

1

您不能返回指向本地变量的指针。当函数退出时,局部变量被破坏。或者:

  • 传中的函数调用
  • 的malloc你要返回数组的缓冲区(和调用者必须释放它)
0

现在,它的工作原理。我为变量(测试)添加了内存分配,并修改了函数createData的返回行。初始代码不起作用的原因是(test)是一个局部变量,在退出函数createData后将被销毁。

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

static int* createData() 
{ 

     int *test; 

    int c; 
    int *ptr; 

    test = malloc(4*sizeof(int)); 

    printf("Indtast 4 tal, 1 af gangen\n"); 
    for (c = 0; c < 4; c++) 
    { 
     scanf("%d", &test[c]);  
    } 

    ptr=test;  /* ptr=&test is not ok. ---> test is already the address you need ---> if you want, you can do this ptr=&test[0] and it's ok */ 
    return (ptr); 
} 

static void udskriv(int* ptr) 
{ 
    int i; 
    for (i=0;i<4;i++) 
    { 
     printf("%d\n",*ptr++); 
    } 
} 

int main(void) 
{ 
    udskriv(createData()); 
    return 0; 
}