我在指针中给出了两个全局变量。 我需要做的一切 将字符值赋给某些局部变量 检查边界。
// 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 )
我将非常感激。我现在迷路了。花了这么多时间试图解决这个问题。
答案 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 };