안녕하세요
c# 초보자 입니당. c++만 하다가 c# 해보는데 어렵네요 ㅎ
일단 궁금한 점이 있습니당
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct MY_DATA
{
public ushort value1;
public ushort value2;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 24)]
public byte[] name;
}
public MY_DATA[] my_data = new MY_DATA[2];
int size = Marshal.SizeOf(my_data[0]);
위와 같이 했을 경우 size는 28이 나옵니다.
근데 디버깅으로 봤을 때는 my_data[0]이나 [1]이나 name이 null 로 나옵니다.
그래서
Array.Clear(my_data[0], 0, my_data[0].Length);
하면 null 인데 접근했다고 에러가 뜹니다. 당연하겠죠
public MY_DATA[] my_data = new MY_DATA[2];
for( int i = 0 ; i < 2 ; ++i )
{
my_data[i] = new();
}
이처럼 for문으로 객체를 생성해 보았습니다. 여전히 name은 null이 더군요.
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public MY_DATA
{
// 생략
public MY_DATA()
{
name = new byte[24];
}
}
구조체에 생성자를 명시하고 name을 new로 할당했습니다.
이렇게 했더니 name이 정상적으로 24바이트씩 보이더군요.
여기서 궁금한 것이…
public MY_DATA[] my_data = new MY_DATA[2];
int size = Marshal.SizeOf(my_data[0]);
이와 같이 했을 경우에 size가 정상적으로 28바이트가 출력이 되는데
왜 name이 null로 보이나요?
my_data[0].value1이나 value2에 데이터 접근이 가능한 것으로 보아
메모리 어딘가에 할당이 된 것 같은데
for문으로 돌려서 직접 [0]과 [1]에 new로 또 해줘야 하나요?
그리고 구조체 생성자에도 명시를 해야 하구요?
public MY_DATA[] my_data = new MY_DATA[2];
했을때 my_data[0] 이랑
public MY_DATA[] my_data = new MY_DATA[2];
for( int i = 0 ; i < 2 ; ++i )
{
my_data[i] = new();
}
했을 때 my_data[0] 이랑 다른 주소의 데이터로 짐작이 되는데
제가 생각하는 것이 맞는지 궁금합니다.
두서 없이 질문을 드렸네요.
고수님들 가르침을 부탁드리겠습니다. ㅠ