我正在运行这个简单的程序,我得到的输出是"总线错误".使用一些调试语句我发现它发生的点是在strcat()调用.
#include<stdio.h>
#include<string.h>
main()
{
char *s = "this is ";
char *s1 = "me";
strcat(s,s1);
printf("%s",s);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我在MAC,64位操作系统上使用gcc编译器运行它.如果我需要提供更多规格,请告诉我.
谢谢!
我正在尝试在我的64位Macbook Pro上学习NASM.我有以下代码,我试图将变量的值分配给初始化变量.
global start
default rel
section .data
a: dq 1
section .bss
b: resq 1
section .text
start:
mov rax, a
mov [b], rax
Run Code Online (Sandbox Code Playgroud)
代码编译和链接但生成bus error运行时.有没有人对如何克服这个问题有任何想法?
当我上学期第一次做这个项目时,代码运行得很好。现在,当写入要在进程之间共享的映射内存时,我收到总线错误,并且我不确定为什么它不再工作。
Account_Info *mapData()
{
int fd;
//open/create file with read and write permission and check return value
if ((fd = open("accounts", O_RDWR|O_CREAT, 0644)) == -1)
{
perror("Unable to open account list file.");
exit(0);
}
//map data to be shared with different processes
Account_Info *accounts = mmap((void*)0, (size_t) 100*(sizeof(Account_Info)), PROT_WRITE,
MAP_SHARED, fd, 0);
int count= 0;
//loop to initialize values of Account_Info struct
while (count != 20)
{
//bus error occurs here
accounts[count].CurrBalance= 0;
accounts[count].flag = 0;
int i = 0; …Run Code Online (Sandbox Code Playgroud) 我试图在C中创建一个简单的2D数组,但显然遇到了一些内存问题.我的设置很简单,我不知道出了什么问题.我承认我对指针的理解是不够的,但我仍然认为这应该有效.谁能看到这里的缺陷?
typedef unsigned int DATUM;
DATUM **series_of_data;
void initialize_data()
{
*series_of_data = (DATUM *) malloc(1024 * sizeof(DATUM));
}
Run Code Online (Sandbox Code Playgroud)
这导致我的程序在运行时遇到总线错误而崩溃.
像往常一样,我在这里阅读了很多帖子。我发现了一篇关于一般总线错误的特别有用的帖子,请参阅此处。我的问题是我无法理解为什么我的特定代码会给我一个错误。
我的代码是自学C语言的一次尝试,是对我学Java时做的一个游戏的修改。我的游戏的目标是获取一个巨大的 5049 x 1 文本文件。随机选择一个单词,将其打乱并尝试猜测它。我知道如何做到这一切。所以无论如何,文本文件的每一行都包含一个单词,例如:
5049
must
lean
better
program
now
...
Run Code Online (Sandbox Code Playgroud)
所以,我在C中创建了一个字符串数组,尝试读取这个字符串数组并将其放入C中。我没有做任何其他事情。一旦我将文件放入 C 中,其余的事情就很容易了。更奇怪的是它遵守了。当我用./blah命令运行它时,我的问题出现了。
我得到的错误很简单。它说:
zsh: bus error ./blah
Run Code Online (Sandbox Code Playgroud)
我的代码如下。我怀疑这可能与内存或缓冲区溢出有关,但这完全不科学,而且是一种直觉。所以我的问题很简单,为什么这个 C 代码会给我这个总线错误消息?
#include<stdio.h>
#include<stdlib.h>
//Preprocessed Functions
void jumblegame();
void readFile(char* [], int);
int main(int argc, char* argv[])
{
jumblegame();
}
void jumblegame()
{
//Load File
int x = 5049; //Rows
int y = 256; //Colums
char* words[x];
readFile(words,x);
//Define score variables
int totalScore = 0;
int currentScore = 0;
//Repeatedly pick a random work, …Run Code Online (Sandbox Code Playgroud) 我有两个寄存器 w1 和 w2,我想将它们存储在堆栈上。我想将完整的单词w1和w2的一半存储到堆栈中。这是我的实现:
STR w1, [sp, #-8]!
STRH w2, [sp, #-8]!
Run Code Online (Sandbox Code Playgroud)
编译时,第一条指令运行良好,但第二条指令引发总线错误。我知道这是一些对齐问题,但我无法正确理解为什么会发生这种情况?
我正在针对 ARMv8(64 位)架构进行编译。
我目前正在阅读Expert C Programmign - Deep C Secrets.在作者解释总线错误和分段错误的第164页上,他展示了这行代码
union {
char a[10];
int i;
} u ;
int * p = ( int * ) &(u.a[1]);
*p = 17; /* the misaligned addr in p causes a bus error */
Run Code Online (Sandbox Code Playgroud)
上面的代码假设触发了一个总线错误,但是当我运行它时,它运行正常没有任何错误.作者给出了以下解释
这会导致总线错误,因为数组/ int联合确保字符数组"a"也处于整数的合理对齐地址,因此"a + 1"绝对不是.然后,我们尝试将4个字节存储到仅为单字节访问对齐的地址中.一个好的编译器会警告错位,但它不能发现所有事件.
我对上述陈述的理解是,char1个字节,我们试图int在索引上放置一个4字节,char a[10]因此会发生总线错误(我不确定我的理解是对还是错)
我的问题是为什么上面的代码不会导致总线错误.
注意:我不是CS学生,简单的解释会有所帮助.
注意:已经提出了一个对这个问题看起来很熟悉的问题,但我只针对上面的代码块.
我无法使用以下汇编代码生成“总线错误”。这里我使用的内存地址不是合法的“规范地址”。那么,我该如何触发该错误?
我在 Ubuntu 20.04 LTS 和 NASM 2.14.02 下运行这段代码,但它导致负载上的 SIGSEGV 分段错误,而不是 SIGBUS。
global _start
section .text
_start:
mov rax, [qword 0x11223344557788]
mov rax, 60
xor rdi, rdi
syscall
Run Code Online (Sandbox Code Playgroud)
编译后对应的X86-64汇编代码:
Disassembly of section .text:
0000000000401000 <_start>:
401000: 48 a1 88 77 55 44 33 movabs 0x11223344557788,%rax
401007: 22 11 00
40100a: b8 3c 00 00 00 mov $0x3c,%eax
40100f: 48 31 ff xor %rdi,%rdi
401012: 0f 05 syscall
Run Code Online (Sandbox Code Playgroud) 这将是两个问题之一
我有两段代码,唯一的区别是int*a声明之间的顺序; 和int cpt = 0; 在第6和第7行.
情况1:
#include <iostream>
using namespace std;
int main()
{
cout<<"begin"<<endl;
int* a;
int cpt = 0;
cout<<"after init "<<a<<endl;
*a = 2;
cout<<"after assign"<<endl;
cout<<a<<" "<<*a<<endl;
cout<<"after cout"<<endl;
int* b;
*b = 2;
cout<<b<<" "<<*b<<endl;
}
Run Code Online (Sandbox Code Playgroud)
输出:
begin
after init 0x7fff6c97f05e
Bus error: 10
Run Code Online (Sandbox Code Playgroud)
案例2:
#include <iostream>
using namespace std;
int main()
{
cout<<"begin"<<endl;
int cpt = 0;
int* a;
cout<<"after init "<<a<<endl;
*a = 2;
cout<<"after assign"<<endl;
cout<<a<<" "<<*a<<endl;
cout<<"after cout"<<endl;
int* …Run Code Online (Sandbox Code Playgroud) 我正在编写一个程序,允许用户输入要读取的人员数据库的文件名; 然后,程序在每个状态链接中创建状态对象的链接列表和人员对象的链接列表,以组织文件中的信息.
我知道链表部分有效,因为我能够直接在文件名中编码并打印出状态列表和每个州的人员列表; 但是,当我尝试允许用户输入文件名作为命令时,我收到一个总线错误.当我在gdb中运行代码时,它告诉我的是:
Program received signal SIGBUS, Bus error.
0x280df0bd in std::operator>><char, std::char_traits<char> > ()
from /usr/lib/libstdc++.so.5
Run Code Online (Sandbox Code Playgroud)
我甚至没有得到一个行号!任何帮助将非常感激.这是我的代码的命令和读取部分:
List<State*>* read(char* filename) {
string fname, lname, birthday, state;
int ssn;
List<State*>* state_list = new List<State*>();
ifstream file(filename);
if (file.fail()) {
cerr << "Error reading file.\n";
exit(1);
}
while (!file.eof()) {
file >> birthday >> ssn >> fname >> lname >> state;
Link<State*>* searchres = searchList(state, state_list);
Person* p = new Person(fname, lname, ssn, birthday, state);
if (searchres == NULL) // …Run Code Online (Sandbox Code Playgroud)