0

我在指针中获得了两个全局变量。我需要做的就是将字符值分配给一些检查边界的局部变量。

// 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 )

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

4

1 回答 1

1

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

int num_arr_elem = size/sizeof(char);

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

在示例中

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)); 

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

struct sss s = { 0 };
于 2013-10-25T09:01:28.433 回答