C语言中的可变大小数组

C语言中的可变大小数组,c,arrays,loops,for-loop,memory-management,C,Arrays,Loops,For Loop,Memory Management,出于某种原因,我的程序给出的第一个输出是垃圾值,而第二个输出是正确的 这是一个来自中国的问题 我知道这个问题已经被别人问过了。我只是想知道我的代码有什么问题 #include <stdio.h> int main() { int index,query; int count1 = 0; scanf("%d%d",&index,&query); for(int i=0;i<index;i++) { int

出于某种原因,我的程序给出的第一个输出是垃圾值,而第二个输出是正确的

这是一个来自中国的问题

我知道这个问题已经被别人问过了。我只是想知道我的代码有什么问题

#include <stdio.h>

int main()
{
    int index,query;
    int count1 = 0;
    scanf("%d%d",&index,&query);
    for(int i=0;i<index;i++)
    {
        int b;
        scanf("%d",&b);
        int A[index][b];
        for(int j=0;j<b;j++)
        {
            scanf("%d",&A[i][j]);
        }
        count1++;
        if(count1<index)
        {
            continue;
        }
        int count2=0;
        while(count2<query)
        {
            int d,e;
            scanf("%d%d",&d,&e);
            printf("%d\n",A[d][e]);
            count2++;
        }
    }
    return 0;
}
#包括
int main()
{
int索引,查询;
int count1=0;
scanf(“%d%d”、&索引和查询);

对于(inti=0;i提示:需要动态分配可变大小的数组,下面是如何在C中进行分配

int rows; 
scanf("%d",&rows);

//2D array 
int**A = malloc(sizeof(int*)*rows); //allocate number of rows

//for each row allocate number of colums 
for(int i = 0; i < rows; i++)
{
   int cols;
   scanf("%d",&cols);
   A[i] = malloc(sizeof(int)*cols);
}
int行;
scanf(“%d”,行和行);
//二维阵列
int**A=malloc(sizeof(int*)*行);//分配行数
//为每行分配列数
对于(int i=0;i
免责声明 我甚至没有点击链接,所以我不知道解决方案是否正确,但假设您的逻辑正确。。

问题 是指在for循环2D数组体的局部阶段中填充,在处理结束时,您希望可以访问该数组(我指的是完整的矩阵,从for循环的每个迭代中填充)

相反,您只得到最后一次迭代声明的数组,这就是为什么您只得到
A[1][3]
元素,而没有得到
A[0][1]
,因为第二行是在最后一次(第二次迭代)中填充的,而第一行是在第一次迭代(第一次声明的
A
)中填充的,一旦第一次迭代终止,它就超出范围

修复 因此,您需要解决的是为矩阵动态分配内存,每次输入列的新维度时,都要使用

我相信我的解释会对您有所帮助,因为您需要的是固定的行数,以及每次迭代时可调整的列数

下面是一个基于我在上面共享的链接的示例,它直观地显示了什么是您的矩阵(一个1D指针数组),并显示了下面的代码如何操作它:

完整代码示例:

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

int main()
{
    int index,query;
    int count1 = 0;
    scanf("%d%d",&index,&query);

    // An array of `index` (e.g. 2) pointers to integers
    int *A[index];
    // Initialize all the pointers to NULL
    for(int k = 0; k < index; ++k)
      A[k] = NULL;

    for(int i=0;i<index;i++)
    {
        int b;
        scanf("%d",&b);

        // Replaced your 'int A[index][b];' with the following:
        // Every time a new number of columns (that's 'b') is read,
        // we need to adjust the numbers of columns our matrix ('A') has.
        // That means, that for every pointer (row), we need to re-allocate
        // the number of columns it points to, which is basically a 1D array, of dimension 'b'
        for(int k = 0; k < index; ++k)
          A[k] = realloc(A[k], b * sizeof(int) );

        for(int j=0;j<b;j++)
        {
            scanf("%d",&A[i][j]);
        }
        count1 ++;
        if(count1<index)
        {
            continue;
        }
        int count2=0;
        while(count2<query)
        {
            int d,e;
            scanf("%d%d",&d,&e);
            printf("%d\n",A[d][e]);
            count2++;
        }
    }

    // Free the dynamically allocated memory
    for(int k = 0; k < index; ++k)
          free(A[k]);
    return 0;
}

专业提示:调用
realloc()
的典型方法是使用特定指针进行重新分配,测试该指针,如果一切正常,则更改旧指针,如中所述,我在那篇文章中没有这样做是为了“简洁”.

这里不适合使用C VLA。似乎您需要动态分配内存。唯一可以使用的VLA是指向其他数组的指针数组。所有其他数组都应该动态分配

类似下面的内容

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

int main( void ) 
{
    size_t number_of_arrays;
    size_t number_of_queries;

    scanf( "%zu%zu", &number_of_arrays, &number_of_queries );

    int **a = malloc( number_of_arrays * sizeof( int * ) );

    for ( size_t i = 0; i < number_of_arrays; i++ )
    {
        size_t size;
        scanf( "%zu", &size );

        a[i] = malloc( size * sizeof( int ) );

        for ( size_t j = 0; j < size; j++ ) scanf( "%d", &a[i][j] );
    }

    for ( size_t i = 0; i < number_of_queries; i++ )
    {
        size_t array_index;
        size_t element_index;

        scanf( "%zu%zu", &array_index, &element_index );

        printf( "%d\n", a[array_index][element_index] );
    }

    for ( size_t i = 0; i < number_of_arrays; i++ ) free( a[i] );
    free( a );                                                         
}
然后程序输出将是

5
9
对于您的代码,它是无效的。例如,变量
b
未初始化,因此数组的声明具有未定义的行为

int b;
scanf("%d",&b);
int A[index][b];
            ^^^

您的代码确实可以从有意义的变量名中获益。@ChrisTurner OP正在重命名它们的变量…正在进行中。@Blobonat,这不行。对不起,您的代码还没有接近问题的解决方案。输入从两个数字开始,数组数n和查询数q。因此,首先您必须读取这些数字。(我看到您正在进行编辑,似乎正在使用
index
表示n,使用
query
表示q。您最好还是坚持使用问题中的名称,或者使用更具描述性的名称,如
NumberOfArrays
而不是
index
)然后输入有n行,每行都有一定数量的值。所以你的程序需要阅读每一行…@toneguy3n我对你有同情心。OP不是要求代码解决方案。他们要求解释他们做错了什么。我没有给出解决方案,因为他做错了什么是由其他人解释的,这应该是一个错误关于如何解决问题的提示。Hi@WalidJabari可能是指其他人你指的是我!:)我更新了我的答案,顺便说一句。我理解你的意图,但请注意。Hi@gsamaras确实,我刚刚读了你的更新答案。虽然VLA是合法的,但一些编译器(如MSVC)不允许类似
int n=5;int arr[n]的内容
我个人更喜欢远离弗拉
5
9
int b;
scanf("%d",&b);
int A[index][b];
            ^^^