标签: c99

void指针条件提升段错误

当我们处理前一个或下一个为null的指针时,我正在使用双链表并获得有关边缘情况的奇怪性能.GDB返回以下错误:

Program received signal SIGSEGV, Segmentation fault.
0x0804a9c1 in DLinkDelete (delete=0xd8c9d33c) at test.c:213
213             if (prevdl && prevdl->next) 
(gdb) p prevdl
$39 = (DoubleLink *) 0xdadadada
(gdb) p prevdl->next
$40 = (void *) 0x0
Run Code Online (Sandbox Code Playgroud)

DoubleLink是一个具有以下格式的结构:

typedef struct
{
    void *next;
    void *prev;
} DoubleLink;
Run Code Online (Sandbox Code Playgroud)

为什么会出现分段错误?

c c99 void-pointers

1
推荐指数
1
解决办法
294
查看次数

当我使用Borland C++构建光标时,为什么这段代码没有正确定位光标?

我发现此代码仅用于gotoxy()使用C标准库的替换函数.显然它编译使用GCC和工作方式类似于gotoxy()中发现的conio.h.

但是我只有用Borland C++编译器V5.5,该编译罚款,但不会重新像光标gotoxy()conio.h做.任何人都可以在使用GCC时验证这是否有效,或者告诉我为什么使用Borland不起作用?

#include<stdio.h>
#include<stdlib.h>

void gotoxy(int x, int y)
{
    printf("%c[%d;%df", 0x1B, y, x);
}

int main()
{
    gotoxy(10, 10);
    printf("hello world");
}
Run Code Online (Sandbox Code Playgroud)

c gcc c++builder c99 borland-c++

1
推荐指数
1
解决办法
780
查看次数

32位与64位环境中的int_max

INT_MAX32位和64位环境之间有什么不同?虽然我听说有人说64位环境只使用32位环境的INT_MAX,但似乎情况确实如此.

c int c99

1
推荐指数
1
解决办法
5889
查看次数

指针地址如何具有不同的长度?

我刚刚执行了这个代码示例:

int *i = (int*) malloc( sizeof(int) );
printf( "%p, %p\n", &i , i );
Run Code Online (Sandbox Code Playgroud)

这就是我得到的:

0x7fff38fed6a8, 0x10f7010
Run Code Online (Sandbox Code Playgroud)

所以我想知道为什么第二个地址比第一个地址短?

c pointers c99 pointer-address

1
推荐指数
1
解决办法
159
查看次数

如何将unsigned转换为uint64_t?

我有一个unsigned并希望将其转换为uint64_t(如果可能的话).

我怎么做?如果可能的话,我想避免依赖于未定义的行为.

谢谢!

c unsigned c99

1
推荐指数
1
解决办法
5594
查看次数

可以调用void语句导致未定义的行为吗?

想象一下:

int X;

X = X;
Run Code Online (Sandbox Code Playgroud)

这将是未定义的行为

1在以下情况下,行为未定义:

[...]

具有自动存储持续时间的对象的值在不确定时使用(6.2.4,6.7.8,6.8).

但是这个怎么样?

int X;

X;
Run Code Online (Sandbox Code Playgroud)

X;参考引用的invokation是否允许编译器导致未定义的行为?或者这不算X被"使用"?

c c99 undefined-behavior c11

1
推荐指数
1
解决办法
132
查看次数

不应该是具有返回类型的函数但是在体内没有返回是错误的吗?

#if _OWN_DEBUG_LEVEL > 0

    void *GetPostArgs(TYPE *Fcgx_Request, FILE *fpDebugPointer)

#else

    void *GetPostArgs(TYPE *Fcgx_Request)

#endif
{    
    ...

    if (...)
    {
        return NULL;
    }

    ...

    do
    {
        ...

        if (...)
        {
            return NULL;        
        }

        ...
    }
    while (...);

    if (...)
    {
        return NULL;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是使用gcc 4.3生成NOT错误的代码的代表代码

但它应该,不应该吗?

我的意思是该函数的两种情况都有返回类型指针.

在身体的最后,没有任何回报.那不合法吗?但代码编译,更有趣的是:当函数被调用并运行到函数体的末尾时,它返回0x80808080.

这可能是由我的代码中未定义的行为引起的吗?

或者这仅仅是一个gcc bug?

或者我可以做一些不同的错误吗?

c c99 return-type undefined-behavior

1
推荐指数
1
解决办法
53
查看次数

"初始化元素不是常量",在C99的静态结构上使用指定的初始值设定项

有人可以解释这种行为吗?

使用编译器标志std=c99我得到以下错误:

  • 对于b1,"初始化元素不是常数".
  • "预期表达''.' 令牌"为b2
  • b3没关系.

什么时候不使用-std=c99所有行都行.当不使用静态b1是好的.我正在使用GCC.

typedef struct A_tag {
    int v;
    int w;
} A;

typedef struct B_tag {
    A super;
    int x;
    int y;
} B;

void test(){
static B b1 = ((B){.super={.v=100}, .x=10});
static B b2 = ({.super={.v=100}, .x=10});
static B b3 = {.super={.v=100}, .x=10};
}
Run Code Online (Sandbox Code Playgroud)

c c99

1
推荐指数
1
解决办法
747
查看次数

stdint.h和C99

我读了C99标准,它stdint.h是C标准库的一部分.

我是否正确阅读,如果我测试符合C99,请使用:

defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
Run Code Online (Sandbox Code Playgroud)

这意味着stdint.h应该可用吗?

一个C99很好的例子:我可以考虑一个假装符合要求但不提供stdint.h与自己的合规声明不一致的环境,因此有错误吗?

编辑:对于好奇的系统,有问题的系统是带有HP C编译器的OpenVMS(不是gcc,在openVMS上提供stdint.h).因此,根据到目前为止收到的答案和评论,我必须将此实现(假装为C99)视为错误.有关详情,请访问:https://groups.google.com/forum/#!topic/comp.os.vms/Bnh3tIOc7bo%5B101-125%5D

c c99 standard-library openvms stdint

1
推荐指数
1
解决办法
717
查看次数

在c中初始化整数指针,不会导致预期的未指定行为

在最近切换到c之后,我被告知星期天有一千种方法来引用一个尚未初始化的值并不是一种好的做法,并导致出乎意料的行为.具体来说,(因为我以前的语言将整数初始化为0)我被告知在未初始化时整数可能不等于零.所以我决定把它考验一下.

我编写了以下代码来测试这个声明:

#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <assert.h>

int main(){
    size_t counter = 0;
    size_t testnum = 2000; //The number of ints to allocate and test.
    for(int i = 0; i < testnum; i++){
        int* temp = malloc(sizeof(int));
        assert(temp != NULL); //Just in case there's no space.
        if(*temp == 0) counter++;
    }
    printf(" %d",counter);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我这样编译它(如果它很重要):

gcc -std=c99 -pedantic name-of-file.c

根据我的教师所说的,我希望temp指向一个随机整数,并且计数器不会经常递增.但是,我的结果将这个假设从水中吹走了:

testnum:  ||  code returns:
2             2
20            20
200           200
2000          2000
20000         20000
200000 …
Run Code Online (Sandbox Code Playgroud)

c initialization c99

1
推荐指数
1
解决办法
147
查看次数