C:为未初始化的struct和union赋值

时间:2013-10-25 08:23:52

标签: c pointers struct stack unions

我在指针中给出了两个全局变量。 我需要做的一切 将字符值赋给某些局部变量 检查边界。

// global variable
char *min_ptr, *max_ptr ;

void markchar( char *x, int size, char marked) 
{
    // for every byte of x to have the value marked
    int num_arr_elem = size/sizeof(char);
    for (int i=0; i<num_arr_elem; i++) {
        x[i] = marked;
    }

}

我分配如下: 这是对的吗? 我现在很困惑。如何使用全局最小和最大指针检查边界? 如何为未初始化的struct和union和数组分配任何内容? 默认情况下它们都是null和零?但似乎我在做以下事情时仍然遇到错误。

我需要这样做,以便稍后看到堆栈的哪个部分没有在max和min指针之间分配任何值...所以我需要以某种方式检查下面的某些值是否在这些边界之间,但它们甚至没有初始化,所以如何我检查一下吗?

这是正确的吗?

int i ;
markchar( (char *) &i, sizeof(i), 0xa1 )

这是正确的吗?

struct sss {
    char* a ;
    char b[20] ;
    float c ;
} s;
markchar( (char *) &s, sizeof(s), 0xb1 )

这是正确的吗?

union ccc {
    float a ;
    char b ;
    int c ;
} u ;
markchar( (char *) &u, sizeof(u), 0xc1 )

这是正确的吗?

char aa[50] ;
markchar( (char *) &aa, sizeof(aa), 0xd1 )

我将非常感激。我现在迷路了。花了这么多时间试图解决这个问题。

1 个答案:

答案 0 :(得分:1)

首先,您的示例中有许多冗余代码。

int num_arr_elem = size/sizeof(char);

您不必除以sizeof(char)sizeof char保证始终为1.

在示例中

char aa[50] ;
markchar( (char *) &aa, sizeof(aa), 0xd1 )

它也错误地提供指向数组的指针,因为在C名称中隐式转换为指向第一个元素的指针,因此markchar( aa, sizeof(aa), 0xd1 )就足够了。

关于初始化:如果值是全局的,则默认情况下将其初始化为0.如果这是本地的,则它保持未初始化,因此存在一些垃圾变量是&#34;初始化&#34;至。 如果要使用给定模式填充任何变量(无论这是普通变量还是srtuct或数组),您可以使用memset。与您的代码相关的示例可能是:

char marked;    
memset(struct s, marked, sizeof(struct sss)); 

您也可以使用初始化程序执行此操作,但只能在使用时执行此操作:

struct sss s = { 0 };