如何将这些数字存储在C中?

时间:2015-11-22 19:31:12

标签: c arrays

假设你有一个像这样的数组

{ 1 2 5 7 2 3 7 4 2 1 }

并且你想存储阵列的前半部分和后半部分之间的差异在第2和第4位。

诀窍是,我需要稍后在其他代码中使用这些存储的数字,所以我无法弄清楚我将如何存储这些数字。

我有这个方法

int * getPositions(int *array, int size){
    int * c[(size/2)];
    int counter = 0;
    for(int i = 0; i < size /2; i++) {
        if (*(array + i) != *(array + (size - 1) - i)) {
            c[counter]= (int *) i;
            counter++;
        }
    }return (int *) c;
 }

但它似乎将-1774298560存储到每个位置。当我尝试打印时,我知道原因

int c = (int) getPositions(array, size_of_array);

for(int i = 0; i < ((size_of_array/2)); i++){
    printf("%d\t", c);
}
所有打印出来的都是

-1774298560 -1774298560 -1774298560 -1774298560 -1774298560

PS:我已在其他地方初始化了arraysize_of_array

PS:我已将评论纳入考虑范围,并将代码更改为以下内容

int * getPositions(int *array, int size){
    int * c = (int *) malloc((size_t) (size/2));
    int counter = 0;
    for(int i = 0; i < size /2; i++) {
        if (*(array + i) != *(array + (size - 1) - i)) {
            c[counter]= i;
            counter++;
        }
}

3 个答案:

答案 0 :(得分:5)

如果函数应该返回一个简单的int数组,则需要声明一个指向int的指针,然后调用malloc来为该数组保留空间。然后填入数组,并返回指针。调用函数在某些时候需要free内存。

int *getPositions(int *array, int size)
{
    int *c = malloc( (size/2) * sizeof(int) );
    if ( c == NULL )
        return NULL;

    // put stuff in the array using array syntax, e.g. 
    c[0] = array[0];

    return c;
}

像这样调用函数

int *c = getPositions( array, size );

if ( c != NULL ) 
    for( int i = 0; i < (size/2)); i++ )
        printf( "%d\t", c[i] );

free( c );

注意:

  • 是的,C中的错误检查很痛苦,但你必须这样做,或者你的 程序将随机崩溃。
  • 您可以使用带指针的数组语法,只需确保您不会读取或写入指针所引用的内存的末尾。
  • NULL指针传递给free是合法的。

答案 1 :(得分:2)

另一种选择。

int * getPositions(int *array, int size);
int main() {
    int array[] = { 1, 2, 5, 7, 2, 3, 7, 4, 2, 1 };

    int size_of_array = sizeof(array) / sizeof(int);
    int *ptr = getPositions(array, size_of_array);

    for(int i = 0; ptr[i] != '\0' ; i++){
        printf("%d\t", *(ptr + i));
    }

    return 0;
}
int * getPositions(int *array, int size) {
    int temp[size/2];
    int counter = 0;

    for (int i = 0; i < size / 2 ; i++) {
        if (array[i] != array[(size - 1) - i]) {
            temp[counter++] = i;
        }
    }
    int *c = malloc(counter * sizeof(int));
    for (int i = 0; i < counter; i++) {
        c[i] = temp[i];
    }

    return  c;
}

答案 2 :(得分:0)

我的编译器实际上发疯了......你正在使用哪个编译器?任何现代静态分析仪都应该警告你

aftnix@dev:~⟫ gcc -std=c11 -Wall st.c 
st.c: In function ‘getPositions’:
st.c:8:25: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
             c[counter]= (int *) i;
                         ^
st.c:11:6: warning: function returns address of local variable [-Wreturn-local-addr]
     }return (int *) c;
      ^
st.c: In function ‘main’:
st.c:16:13: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
     int c = (int) getPositions(array, 10);

因此编译器显示了代码的所有问题。您编辑的代码甚至无法编译:

aftnix@dev:~⟫ gcc -std=c11 -Wall st.c 
st.c:4:4: error: expected identifier or ‘(’ before ‘[’ token
 int[] getPositions(int *array, int size){
    ^
st.c: In function ‘main’:
st.c:17:5: warning: implicit declaration of function ‘getPositions’ [-Wimplicit-function-declaration]
     int c = (int) getPositions(array, 10);

你必须考虑几件事。

  1. 如果您需要返回存储地址,请不要尝试返回本地变量。由于局部变量在堆栈中分配。堆栈帧具有相同的功能寿命。使用malloc和co在堆中分配内存。了解如何分配和使用运行时数据结构对C程序员来说是非常重要的,因为C并没有引人入胜的神奇东西。 C几乎是裸机。
  2. Stack Vs Heap

    1. 当传递数组/指针时,首先应该考虑您的设计。你想改变原来的数组&#34;到位&#34;?或者你想要一个不同的副本&#34;转换&#34;阵列。通常你应该尽量避免更换内存&#34;到位&#34;因为可能还有其他用户。但如果没有这样的担忧,你可以将你的功能设计为&#34;输入&gt;输出&#34;基础。这意味着您将不会返回void,并将返回已转换的数组本身。