2014-07-23 43 views
0

我想返回一个指向一个int数组的指针,它是给定数字的所有分隔符。 当我给出10作为参数并运行我的程序时,我注意到方法dividers_of(...)给出了正确的输出。 但不幸的是,第二种称为number_dividers(...)的方法没有。 例如,看起来好像数组中的某些位置未被设置为0或分频器,如输出 'element 2009'所示。 我做错了什么?我的int数组没有正确初始化的可能性怎么样

#include <stdio.h> 

int* dividers_of(int number){ 
    int dividers [number]; 
    dividers[0]=1; 
    int *ptr=dividers; 
    int i; 
    for(i=2;i<number;i++){ 
      if(number%i==0){ 
        dividers[i]=i; 
        printf("deler : %i\n",dividers[i]); 
      } else{ 
        dividers[i]=0; 
        printf("niet- deler : %i\n",i); 
      } 
    } 
    return ptr; 
} 

int number_dividers(int* ptr,int length){ 
    int * runner = ptr; 
    int number_dividers ; 
    while(runner!=ptr+length){ 
        printf("element %i\n",*runner); 
         if(*runner!=0){ 
             number_dividers++; 
         } 
       runner++; 
       } 
    return number_dividers; 
} 

输出:

deler:2 niet- deler:3

niet- deler:4

deler:5

niet- deler:6

宁静:7

niet- deler:8

niet- deler:9

元件1

元件2009

元件2008

元素0

元素0

元件1638

元件23

元件1

元件2293

元素0

+0

BTW'int number_dividers;'未初始化。 – BLUEPIXY

回答

4

这里的问题是不是该数组没有初始化,这是它的一个本地一个函数内部的变量,并在该函数返回时超出范围。

具有和使用指向另一个函数中的局部变量的指针会导致undefined behavior


有基本上只有两种解决方案可供选择:

  1. 动态分配给在该函数的内存,并返回;或者

  2. 在调用函数中定义数组,并将其作为参数传递给需要它的函数。

+0

但是,如果我将该方法返回的ptr分配给另一个ptr,该怎么办?如果我将这个新指针分配给第二个方法,它仍然会显示未定义的行为吗? – BURNS

+1

@BURNS如果你将'ptr'指向本地数组并返回它,内存'ptr'指向的内容仍然会超出范围。 –

+0

如果内存是动态分配的,那么局部变量会继续存在? – BURNS