我正在尝试创建一个结构,该结构具有struct nodo在代码上方定义的 2 个类型的指针。但它给了我错误:
在 '=' token lista dati_mappa=NULL; 之前应为 ':', ',', ';', '}' 或 'attribute'。
这是代码:
typedef int data;
struct nodo
{
data elem;
struct nodo *next;
};
typedef struct nodo *lista;
struct mappa {
data R;
data C;
lista dati_mappa = NULL;
lista pos_valida = NULL;
};
Run Code Online (Sandbox Code Playgroud) 假设我有以下程序:
#include <signal.h>
#include <stddef.h>
#include <stdlib.h>
static void myHandler(int sig){
abort();
}
int main(void){
signal(SIGSEGV,myHandler);
char* ptr=NULL;
*ptr='a';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我注册了一个信号处理程序和一些行,我取消引用了一个空指针 ==> 触发了 SIGSEGV。但它是如何触发的?如果我使用strace(输出剥离)运行它:
//Set signal handler (In glibc signal simply wraps a call to sigaction)
rt_sigaction(SIGSEGV, {sa_handler=0x563b125e1060, sa_mask=[SEGV], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7ffbe4fe0d30}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
//SIGSEGV is raised
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=NULL} ---
rt_sigprocmask(SIG_UNBLOCK, [ABRT], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, ~[RTMIN RT_1], [SEGV], 8) = 0
Run Code Online (Sandbox Code Playgroud)
但是缺少一些东西,信号如何从 CPU 传递到程序?我的理解:
[Dereferences null pointer] -> …Run Code Online (Sandbox Code Playgroud) 我在 c 中创建了两个线程。我想由每个线程执行两个单独的函数。如何使一个特定的线程首先被执行。
#include <stdio.h>
#include <pthread.h>
void* function_1(void* p)
{
// statements
}
void* function_2(void* p)
{
// statements
}
int main(void)
{
pthread_t id1;
pthread_t id2;
pthread_create(&id1, NULL, function_1, NULL);
pthread_create(&id2, NULL, function_2, NULL);
pthread_exit(NULL);
}
Run Code Online (Sandbox Code Playgroud)
程序启动时如何使function_1在function_2之前执行?
这是一个来自测试的问题。
int main() {
const int i=1;
const int *p=&i;
int j=2;
const int *q=&j;
j=3;
printf("%d", *p+*q);
int k = 0;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
据我了解,双方p并q都指向一个const int。
我认为当我声明指向非常量值的指针时会出现编译错误,但它工作正常;这是为什么?
我有我想在 div 标签中显示的多行文本内容。为此,我使用 javascript 将内容传递给 div 标签,如下所示
function MyFunction(){
document.getElementById("get").innerHTML = document.getElementById("pass").value;
}Run Code Online (Sandbox Code Playgroud)
#get{
height : 50px;
width : 200px;
border:1px solid;
overflow : auto;
border-color:rgb(204, 204, 204);
}Run Code Online (Sandbox Code Playgroud)
<div id="get" style="border:1px solid" contenteditable="true">
</div>
<br>
<button onclick="MyFunction()">Fetch</button><br>
<br>
<textarea id="pass">
Hello
How are You
</textarea>Run Code Online (Sandbox Code Playgroud)
但是 textarea 中的内容是多行文本。但它在 html div 标签中显示为一行,如上面的代码片段所示,即你好在一行中,你好吗在另一行中,但在 div 标签中,它们都显示在同一行中。
在此代码中,我可以用诸如'a','z'等字符替换ASCII代码.
int main()
{
int ch = 0;
ch = getchar();
if (ch >= 'a' && ch <= 'z')
ch -= 32;
else if (ch >= 'A' && ch <= 'Z')
ch += 32;
else
ch = -1;
if (ch == -1) {
puts("nope");
return 0;
}
putchar(ch);
return 0;
}
Run Code Online (Sandbox Code Playgroud) #include <stdio.h>
int main()
{
int a;
printf(scanf("%d",&a));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我收到此消息"Segmentation fault(core dumped)"
有没有一种方法可以强制gcc检测所有未定义的行为?我希望它检测在编译时和运行时都可以发现的东西。我知道UB不仅有助于简化编译器的创建,而且使编译器可以优化代码。后者在您进行调试时不相关,并且轻量级编译器的需求已不像1972年那样大。此外,gcc在这一点上是一个非常成熟的编译器,如果可能的话,它将进行大量调试工作更轻松。
我知道这-Wformat将对printf("%d", 42)未初始化的变量产生警告。当您尝试访问数组外部的内存时,该参数-Warray-bounds 可能会捕获,尽管我需要在构造实际上产生警告的代码中进行一些工作。我也知道可以使用检测到一些运行时错误-fstack-protector-all。
所以我的问题就是这样。有没有办法保证所有UB都能被检测到,如果可能的话,在编译时,但是最迟在运行时才被检测到?
#include <stdio.h>
int main()
{
repeat:
printf("choose an option: \n1:Draw\n2:Even or Odd:\n3:Text type\n4:How to Dec\n5:Base to Dec:\n6:Count to Bits\n0:Exit\n");
int x;
scanf("%d", &x);
if (x > 6)
printf("Wrong option!\n");
goto repeat;
if (x == 1)
printf("Drawing");
if (x == 0)
printf("we are out!\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我正在使用在线编译器。
我想看到的最终结果是一个简单的菜单,它要求用户输入数字并根据数字执行代码,然后转到起点并再次打印菜单。(这就是我选择 goto 的原因。如果您有其他解决方案可以在执行后重新启动主程序,请告诉我。)
我遇到的问题是,无论我输入多少数字,它都会再次输出菜单而没有消息或不退出(当我输入0时)。
当我发送标志-h或-H时,为什么会出现分段错误.
bool parse_command(int argc, char **argv, bool *header, char **fileName)
{
if (!argv)
return false;
bool *flagh = false;
bool *flagH = false;
char *options = "Hh";
int opt = 0;
while ( (opt = getopt(argc, argv, options ) ) != -1)
{
printf("HELLO");
switch (opt)
{
case 'h':
*flagh = true;
break;
case 'H':
*flagH = true;
break;
default:
usage_p1();
return false;
}
}
printf("%d", opt);
// Implement this function
return true;
}
Run Code Online (Sandbox Code Playgroud)