【问题标题】:C : assign value to uninitialzed struct and unionC:为未初始化的结构和联合赋值
【发布时间】:2013-11-04 06:31:24
【问题描述】:

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

// 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;
    }

}

我分配如下: 这是正确的吗? 我现在很困惑。如何使用全局最小和最大指针检查边界? 如何将任何内容分配给未初始化的结构、联合和数组? 默认情况下它们都是空值和零?但似乎我在执行以下操作时不断收到错误。

我需要这样做,以便稍后查看堆栈的哪一部分在 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 )

我将不胜感激。我现在很迷茫。花了这么多时间试图弄清楚这一点。

【问题讨论】:

  • 您是否知道 C 库中有一个函数 memset,这正是您正在做的事情,在这里?而且,sizeof(char)定义1,所以不需要除以它。
  • 你想要达到的目标也让我很困惑。

标签: c pointers struct stack unions


【解决方案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。如果这是局部值,则未初始化,因此变量“初始化”到了一些垃圾。 如果您想用给定的模式填充任何变量(无论是普通变量还是结构或数组),您可以使用memset。与您的代码相关的示例可能是:

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

您也可以使用 using 初始化器来执行此操作,但这只能使用一次:

struct sss s = { 0 };

【讨论】:

    猜你喜欢
    • 2021-04-09
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    • 2014-07-31
    相关资源
    最近更新 更多