当我们处理前一个或下一个为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)
为什么会出现分段错误?
我发现此代码仅用于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) 是INT_MAX32位和64位环境之间有什么不同?虽然我听说有人说64位环境只使用32位环境的INT_MAX,但似乎情况确实如此.
我刚刚执行了这个代码示例:
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)
所以我想知道为什么第二个地址比第一个地址短?
我有一个unsigned并希望将其转换为uint64_t(如果可能的话).
我怎么做?如果可能的话,我想避免依赖于未定义的行为.
谢谢!
想象一下:
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被"使用"?
#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?
或者我可以做一些不同的错误吗?
有人可以解释这种行为吗?
使用编译器标志std=c99我得到以下错误:
什么时候不使用-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) 我读了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之后,我被告知星期天有一千种方法来引用一个尚未初始化的值并不是一种好的做法,并导致出乎意料的行为.具体来说,(因为我以前的语言将整数初始化为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 ×10
c99 ×10
borland-c++ ×1
c++builder ×1
c11 ×1
gcc ×1
int ×1
openvms ×1
pointers ×1
return-type ×1
stdint ×1
unsigned ×1