......的操作可能未定义?

gbh*_*all 35 c undefined-behavior

我有以下代码

FRAME frameArray[5][10]; // Create the array of frames
int trackBufferFull[5] = {0, 0, 0, 0, 0};// Keeps track of how full the buffer for each node is
int trackFront[5] = {0, 0, 0, 0, 0}; // Array to keep track of which is the front of the array
int trackTail[5] = {0, 0, 0, 0, 0};


// Function to add to the array (CHANGE int frame)
void addFrame (int nodeNumber, FRAME frame)
{
    //Calc tail
    int tail = trackTail[nodeNumber-1];

    // Calc frames in buffer
    int framesinBuffer = trackBufferFull[nodeNumber-1];

    if (framesinBuffer == 10)
    {
        printf("Buffer is full\n");
    }
    else
    {

        // Add frame to frameArray
        frameArray[nodeNumber-1][tail] = frame; 
        printf("\nAdded a frame in node: %i to the buffer\n", nodeNumber);

        // Increment the count
        trackBufferFull[nodeNumber-1]++;
        trackTail[nodeNumber-1] = ++trackTail[nodeNumber-1] % 10;


    }  
}
Run Code Online (Sandbox Code Playgroud)

我用于frameArray的数组是一个长度为10的环绕/循环数组,因此为什么我有代码

trackTail[nodeNumber-1] = ++trackTail[nodeNumber-1] % 10;
Run Code Online (Sandbox Code Playgroud)

一切都在独立文件中完美运行,但是当在较大的文件中运行时,我得到以下编译错误:

$ cnet GARETH -m 30
compiling gareth.c
gareth.c: In function ‘addFrame’:
gareth.c:77:27: error: operation on ‘trackTail[nodeNumber + -0x00000000000000001]’ may be undefined [-Werror=sequence-point]
gareth.c: In function ‘removeFirstFrame’:
gareth.c:98:28: error: operation on ‘trackFront[nodeNumber + -0x00000000000000001]’ may be undefined [-Werror=sequence-point]
gareth.c:105:1: error: control reaches end of non-void function [-Werror=return-type]
cc1: all warnings being treated as errors
Run Code Online (Sandbox Code Playgroud)

第77行是该行

trackTail[nodeNumber-1] = ++trackTail[nodeNumber-1] % 10;
Run Code Online (Sandbox Code Playgroud)

救命.

要查看包含行号和错误的代码,我已将图片上传到:http: //i.imgur.com/wyO5a.png

NPE*_*NPE 54

第77行是该行

trackTail[nodeNumber-1] = ++trackTail[nodeNumber-1] % 10;
Run Code Online (Sandbox Code Playgroud)

trackTail[nodeNumber-1]序列点之间进行了两次更改:一次通过++,一次通过赋值.

这是未定义的行为.

解决方法是重新说明语句,例如:

trackTail[nodeNumber-1] = (trackTail[nodeNumber-1] + 1) % 10;
Run Code Online (Sandbox Code Playgroud)

或者像这样:

trackTail[nodeNumber-1]++;
trackTail[nodeNumber-1] %= 10;
Run Code Online (Sandbox Code Playgroud)


小智 5

trackTail[nodeNumber - 1]在序列点之间进行修改.这就像你在分配

i = ++i;
Run Code Online (Sandbox Code Playgroud)

这也是未定义的行为.

将您的代码更改为以下内容:

trackTail[nodeNumber - 1] = (trackTail[nodeNumber - 1] + 1) % 10;
Run Code Online (Sandbox Code Playgroud)


sep*_*p2k 5

trackTail[nodeNumber-1] = ++trackTail[nodeNumber-1] % 10;
Run Code Online (Sandbox Code Playgroud)

是的,正如错误消息所言,这是未定义的行为。您不允许两次修改相同的值,而中间没有序列点。在这种情况下,这意味着您既不能使用进行递增,也不能trackTail[nodeNumber-1]使用++进行重新分配=

如果您仅使用+ 1而不是++,它将可以正常工作。