相关疑难解决方法(0)

重新定义NULL

我正在为地址0x0000有效且包含端口I/O的系统编写C代码.因此,访问NULL指针的任何可能的错误都将保持不被检测到,同时会导致危险的行为.

出于这个原因,我希望将NULL重新定义为另一个地址,例如一个无效的地址.如果我不小心访问了这样的地址,我将得到一个硬件中断,我可以处理错误.我碰巧有权访问此编译器的stddef.h,因此我实际上可以更改标准头并重新定义NULL.

我的问题是:这会与C标准发生冲突吗?据我所知,从标准中的7.17开始,宏是实现定义的.标准中的其他地方是否有任何内容表明NULL 必须为0?

另一个问题是,无论数据类型如何,大量编译器都会通过将所有内容设置为零来执行静态初始化.尽管标准规定编译器应将整数设置为零并将指针设置为NULL.如果我将为我的编译器重新定义NULL,那么我知道这样的静态初始化将失败.我是否可以将其视为不正确的编译器行为,即使我手动大胆地更改了编译器头?因为我确实知道这个特定的编译器在进行静态初始化时不访问NULL宏.

c null

118
推荐指数
4
解决办法
4558
查看次数

在C中连接字符串,哪种方法更有效?

我遇到了这两种连接字符串的方法:

共同部分:

char* first= "First";
char* second = "Second";
char* both = malloc(strlen(first) + strlen(second) + 2);
Run Code Online (Sandbox Code Playgroud)

方法1:

strcpy(both, first);
strcat(both, " ");       // or space could have been part of one of the strings
strcat(both, second);
Run Code Online (Sandbox Code Playgroud)

方法2:

sprintf(both, "%s %s", first, second);
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,内容both都是"First Second".

我想知道哪一个更有效(我必须执行几个连接操作),或者如果你知道更好的方法来做到这一点.

c string performance concatenation

56
推荐指数
4
解决办法
13万
查看次数

"while(*s ++ =*t ++)"如何复制字符串?

我的问题是,这段代码是做什么的(来自http://www.joelonsoftware.com/articles/CollegeAdvice.html):

while (*s++ = *t++);
Run Code Online (Sandbox Code Playgroud)

网站说上面的代码复制了一个字符串,但我不明白为什么......

它与指针有关吗?

c

55
推荐指数
5
解决办法
3万
查看次数

strcat实现

我试图自己实现strcat,我发现了像这样的Wiki的strcat实现......但是当我使用它时,存在分段错误.

下面的代码有什么问题?

char *
strcat(char *dest, const char *src)
{
    size_t i,j;
    for (i = 0; dest[i] != '\0'; i++)
        ;
    for (j = 0; src[j] != '\0'; j++)
        dest[i+j] = src[j];
    dest[i+j] = '\0';
    return dest;
}
Run Code Online (Sandbox Code Playgroud)

c strcat

7
推荐指数
2
解决办法
5万
查看次数

标签 统计

c ×4

concatenation ×1

null ×1

performance ×1

strcat ×1

string ×1