为什么在 Mac 和 Ubuntu 中使用 strtok_r 的结果不同

Why is different result using strtok_r in Mac & Ubuntu

我在练习c语言strtok_r().
这是我的代码。

#include<stdio.h>
#include<string.h>
#include<unistd.h>

int main(int argc, char** argv){
    char* ptr = NULL;
    char* next[2] = {0};
    char delimiter[4];
    int now = 1;

    strcpy(delimiter, " \t");

    // check argc number
    if(argc != 3){
        printf("usage : ./test {string} {string}\n");
        return -1;
    }

    ptr = strtok_r(argv[1], delimiter, &next[1]); 
    printf("ptr : %s, next : %s\n", ptr, next[1]);
    
    ptr = strtok_r(argv[2], delimiter, &next[2]); 

    while((ptr = strtok_r(NULL, delimiter, &next[1])) != NULL){
        printf("%d : %s, next : %s\n", ++now, ptr, next[1]);
    }
    
    return 0;
}

我认为代码结果会是

$ a.out "I'm test now" "Hello every"
ptr : i'm, next : test now
2 : test, next : now
3 : now, next : (null)

我的 mac 结果是这样。

但我的 ubuntu20.04(Docker 图片)不是。
这是在 Ubuntu.

上执行的结果
$ a.out "i'm test now" "hello every"
ptr : i'm, next : test now
2 : test now, next : 

为什么 Mac 和 ubuntu

的结果不同

关于:

char* next[2] = {0};
...
ptr = strtok_r(argv[1], delimiter, &next[1]); 
printf("ptr : %s, next : %s\n", ptr, next[1]);

ptr = strtok_r(argv[2], delimiter, &next[2]); 

while((ptr = strtok_r(NULL, delimiter, &next[1])) != NULL){ 

数组:next 有 2 个元素。因此,该数组的有效索引是 0 和 1。不是 1 和 2。

发布的代码正在访问 next 数组的末尾。结果是未定义的行为。

注意:数组的有效索引为 0...(数组中的元素数 -1)