C言語の二次元配列の参照について

2022年10月22日

やりたいこと

  • C言語の二次元配列を参照する際、配列宣言時に不適切なサイズ設定すると参照時に意図しない値を受け取る
  • どういう場合にどうなるか検証した

検証環境

  • Zybo z7基板
  • Vivado 2021.2

検証

プログラム

  • main.ctest.hを読み込み、test.cで宣言した二次元配列をprintしている
  • それぞれの記述は下記の通り
  • main.c
#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xil_io.h"
#include "xuartps_hw.h"

int main(){
    init_platform();

    printf("# test_2_7 \n\r");
    printf("%s\n\r",     test_2_7[0]);
    printf("%s\n\r\n\r", test_2_7[1]);

    printf("# test_b_7 \n\r");
    printf("%s\n\r",     test_b_7[0]);
    printf("%s\n\r\n\r", test_b_7[1]);

    printf("# test_1_7 \n\r");
    printf("%s\n\r",     test_1_7[0]);
    printf("%s\n\r\n\r", test_1_7[1]);

    printf("# test_2_6 \n\r");
    printf("%s\n\r",     test_2_6[0]);
    printf("%s\n\r\n\r", test_2_6[1]);
    
    printf("# test_2_5 \n\r");
    printf("%s\n\r",     test_2_5[0]);
    printf("%s\n\r\n\r", test_2_5[1]);
    
    printf("# test_2_4 \n\r");
    printf("%s\n\r",     test_2_4[0]);
    printf("%s\n\r\n\r", test_2_4[1]);
    
    printf("# test_2_3 \n\r");
    printf("%s\n\r",     test_2_3[0]);
    printf("%s\n\r\n\r", test_2_3[1]);
    
    printf("# test_2_2 \n\r");
    printf("%s\n\r",     test_2_2[0]);
    printf("%s\n\r\n\r", test_2_2[1]);
    
    printf("# test_2_1 \n\r");
    printf("%s\n\r",     test_2_1[0]);
    printf("%s\n\r\n\r", test_2_1[1]);
}
  • test.h
#ifndef __TEST_H_
#define __TEST_H_

extern char test_2_7[2][7];
extern char test_b_7[][7];
extern char test_1_7[1][7];
extern char test_2_6[2][6];
extern char test_2_5[2][5];
extern char test_2_4[2][4];
extern char test_2_3[2][3];
extern char test_2_2[2][2];
extern char test_2_1[2][1];

#endif
  • test.c
const char test_2_7[2][7] = {"test0","test1"};
const char test_b_7[][7] = {"test2","test3"};
const char test_1_7[1][7] = {"test4","test5"};
const char test_2_6[2][6] = {"test6","test7"};
const char test_2_5[2][5] = {"test8","test9"};
const char test_2_4[2][4] = {"testA","testB"};
const char test_2_3[2][3] = {"testC","testD"};
const char test_2_2[2][2] = {"testE","testF"};
const char test_2_1[2][1] = {"testG","testH"};

結果

# test_2_7
test0
test1

# test_b_7
test2
test3

# test_1_7
test4


# test_2_6
test6
test7

# test_2_5
test8test9
test9

# test_2_4
testtesttestes
testtestes

# test_2_3
testes
tes

# test_2_2
tetett
tett

# test_2_1
tt
t

詳細

  • 後日調査予定