尝试使用LDD3中最简单的内核模块,而无需对带有BusyBox v1.23.0的Beagle Bone板的自定义内核v4.1.0- rc6进行任何修改.该模块的代码如下:
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_ALERT "Hello, world\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, cruel world\n");
}
module_init(hello_init);
module_exit(hello_exit);
Run Code Online (Sandbox Code Playgroud)
Makefile是:
ARCH := arm
CROSS_COMPILE := arm-cortex_a8-linux-gnueabi-
obj-m := hello.o
all:
make ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C /path/to/linux/source/tree M=$(PWD) modules
clean:
make ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C /path/to/linux/source/tree M=$(PWD) clean
Run Code Online (Sandbox Code Playgroud)
该模块正在rootfs上编译和安装就好了.也正在加载:
$ insmod hello.ko
[ 30.692404] Hello, world
Run Code Online (Sandbox Code Playgroud)
但是当我试图删除它时,我得到:
$ rmmod hello.ko
Segmentation fault
$modprobe -r hello.ko
Segmentation fault
$ …Run Code Online (Sandbox Code Playgroud) 这是一个简短的程序,运行时会出现段错误。即使在迂腐的层面上,它也不会发出关于 clang 的警告。
#include <stdio.h>
#include <stdlib.h>
typedef struct object {
int type;
} object;
void write(object *obj) {
switch (obj->type) {
case 1:
break;
}
}
int main(void) {
printf("hi");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在 x86 Linux 上似乎不会发生崩溃,但我在 aarch64 Android 上。
$ gcc --version
clang version 17.0.6
Target: aarch64-unknown-linux-android24
Thread model: posix
InstalledDir: /data/data/com.termux/files/usr/bin
$ uname -a
Linux localhost 5.10.177-android13-4-00003-ga7208022a7ea-ab10815828 #1 SMP PREEMPT Fri Sep 15 16:40:54 UTC 2023 aarch64 Android
Run Code Online (Sandbox Code Playgroud)
使用 gdb 跟踪它看起来printf最终会调用write,但我现在不知道会发生这种情况。
这看起来像是一个编译器错误,但我可以很好地编译和运行其他程序。如果我删除printf …
只是一个我无法找到正确答案的快速问题.
如果我想声明一个const文本变量,它绝对等于do:
const char my_variable [] = {'t', 'e', 's', 't', 0};
Run Code Online (Sandbox Code Playgroud)
要么
const char my_variable [] = "test";
Run Code Online (Sandbox Code Playgroud)
提前谢谢了
考虑以下代码 - 它可以编译并工作:
use std::rc::Rc;
use std::cell::RefCell;
use crate::Foo::{Something, Nothing};
enum Foo {
Nothing,
Something(i32),
}
fn main() {
let wrapped = Rc::new(RefCell::new(Foo::Nothing));
//....
match *wrapped.borrow() {
Something(x) => println!("{}", x),
Nothing => println!("Nothing"),
};
}
Run Code Online (Sandbox Code Playgroud)
现在我想匹配两个包装的值而不是一个:
use std::rc::Rc;
use std::cell::RefCell;
use crate::Foo::{Something, Nothing};
enum Foo {
Nothing,
Something(i32),
}
fn main() {
let wrapped1 = Rc::new(RefCell::new(Foo::Nothing));
let wrapped2 = Rc::new(RefCell::new(Foo::Nothing));
//....
match (*wrapped1.borrow(), *wrapped2.borrow()) {
(Something(x), Something(y)) => println!("{}, {}", x, y),
_ => println!("Nothing"),
};
}
Run Code Online (Sandbox Code Playgroud)
现在这将给出编译错误:
use …Run Code Online (Sandbox Code Playgroud) 我正在尝试解决这个问题,它有一个向量,并且有一个导致负索引的指针。我想知道 C 是否会忽略它并将其视为正数,或者它在向量中向后移动,例如 -1 是数组的最后一个元素。
int main()
{
int i;
int vals[5];
for (i = 0; i <= 5; i++)
{
vals[i] = 0;
}
printf("%d\n", i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试从大学教程中学习C语言.他们在上面的代码中提到:
当我达到5时,for循环重置,程序再次循环,然后重复循环.
我无法理解为什么,我试图在pythontutor.com中弄明白它6(它现在是C的实验).什么是正确的输出以及为什么会发生这种情况?
这是函数的代码:
void pattern(char word[200], char asPattern[200]) {
for (unsigned i = 0; i < strlen(word); i++) { // unsigned to remove warning
if (strchr("aeiou", word[i]) != 0) asPattern[i] = '*';
else asPattern[i] = '#';
}
Run Code Online (Sandbox Code Playgroud)
基本上这个函数用#的's'和元音替换单词中的辅音,并将新模式存储在asPattern字符串中.但是,如果我在屏幕上显示asPattern,它会显示正确的模式,后跟一堆未知符号(strlen(asPattern)等于211或for循环后的某个东西).我认为问题是asPattern的结尾没有标记,asPattern [strlen(asPattern)] ='/ 0'不起作用,我不知道还能做什么......
我不能使用std :: string,所以请耐心地使用C字符串.
我在一个据称微不足道的俄罗斯方块控制台游戏代码中发现了这一点。
wchar_t *screen = new wchar_t[];
unsigned char *pField;
.
.
.
screen[someMathIndex] = L" ABCDEFG=#"[pField[someOtherMathIndex]];
Run Code Online (Sandbox Code Playgroud)
方括号前面的 wchar 字符串是什么意思?我什至无法找到一种方法来谷歌它。你能不能把我重定向到这个奇怪的东西的一些资源。