roll()函数引起的未定义行为(使用C)

时间:2018-03-25 10:58:53

标签: c arrays undefined-behavior pointer-arithmetic

我的意思是有一个程序从用户那里获取一系列元素,并以不同的顺序输出数组,3rd元素代替1st和{{ 1}}和1st元素向下移动2nd元素位置。 这是预期的输入/输出:

1

数组Enter the array length: 7 Enter the elements in the array: 5 3 4 9 8 7 2 的输出应为:

a2

但是,当我编译并运行我的源代码时,我将其作为输出:

The output array is: 4 5 3 9 8 7 2

现在我知道它与导致未定义行为的25 0 -617353404 32766 4196318 0 -1 函数有关。但是,我不确定我必须在roll()函数中改变什么以阻止这种情况发生。

另请注意,我可能roll()函数中使用指针算法(主要是正常的)。

接下来我应该怎样做才能确保我的代码在使用指针运算的同时准确地修改roll()数组,以便在主函数中正确地打印a2数组中的值?

这是我的源代码:

a2

谢谢。

1 个答案:

答案 0 :(得分:1)

看起来你不确定该怎么做。例如,无需分配:

 a2[s] = a1[s];  

这里更有问题的是你要超出数组边界,调用未定义的行为。

您的roll函数没有做任何有用的事情。 您需要使用指针来实际访问数组的元素。

解决方案比您想象的更简单。首先处理数组3的{​​{1}}元素,然后将数组的其余部分a1复制到数组a1

  

另请注意,我可能使用指针算法   a2函数。

当然,但是数组roll()运算符更好,而[]会更快。

测试程序:

memcpy

测试:

#include <stdio.h>

void roll1(int *a1, int n, int *a2);

int main(void)
{
    int s, i; 

    printf("Enter the size of array: ");
    scanf("%d", &s);

    int a1[s], a2[s];

    printf("Enter the elements of the array: ");

    for(i = 0; i < s; i++)
    {
        scanf("%d", &a1[i]);
    }

    roll1(a1, s, a2);

    for(i = 0; i < s; i++)
    {
        printf("%d ", a2[i]);
    }
    return 0;
}

//  5 3 4 9 8 7 2
//  4 5 3 9 8 7 2
void roll1(int *a1, int n, int *a2)
{
    // array subscription: 
    // 1.
    //a2[0] = a1[2];    
    //a2[1] = a1[0];
    //a2[2] = a1[1];

    // or pointer arithmetic: 
    // 2.

    //(*a2)   = *(a1+2);    
    //*(a2+1) = *(a1);
    //*(a2+2) = *(a1+1);

    // 3. OR
    int * a1p = a1;
    int * a2p = a2;

    int a2_0 = *a1;
    int a2_1 = *(++a1p);
    int a2_2 = *(++a1p);

    //printf("%d %d %d\n",a2_0,a2_1,a2_2);

    *(a2p)     = a2_2;
      ++a2p;
    *(a2p)     = a2_0;
      ++a2p;
    *(a2p)     = a2_1;

    // now the rest:
    //1.
    // memcpy(a2+3, a1+3, sizeof(int) * (n-3) );  

    //2. or  
    //for(int i=3; i<n; i++){
    //    *(a2+i) = *(a1+i);
    //} 

    //3. OR
    for(int i=3; i<n; i++){
       *(++a2p) = *(++a1p); 
    }
}