关于在C/C++中悬空指针,我有点困惑
void remove(){
Node* curr = new Node(10);
Node* pt = curr;
delete curr;
// do something here
// do other thing here
}
Run Code Online (Sandbox Code Playgroud)
我假设Node* pt在函数remove()终止之前仍然悬空指针?
终止Node* pt后我不必担心指针remove()?
所以我有一个分配,我基本上必须在汇编中弄清楚变量是如何存储的,而且我在弄清楚 C++ 如何处理各种变量时遇到了问题。
MyClass var;
MyClass *p = new MyClass();
var.setX(3)
Run Code Online (Sandbox Code Playgroud)
我想我发现的是: *p 引用被存储在堆栈上,而创建的对象被分配在堆上。这意味着 p 正在引用创建的对象。请确认是否正确。
问题是var会发生什么,它是动态分配的吗?我正在查看程序集,但找不到任何可以指向我答案的内容。
很抱歉,这不是正确的地方,但我正在拼命想了解这个程序集脚本中发生的事情(我假设它就是这样,基于我已经完成的谷歌搜索时间。)它是Pokemon Yellow 版本的 rom,我了解一些但不是全部。我想如果我能得到一些帮助来理解这一段在做什么,我就能弄清楚其余的部分。代码如下所示:
PalletTownScript:
CheckEvent EVENT_GOT_POKEBALLS_FROM_OAK
jr z, .next
SetEvent EVENT_PALLET_AFTER_GETTING_POKEBALLS
.next
call EnableAutoTextBoxDrawing
ld hl, PalletTownScriptPointers
ld a, [wPalletTownCurScript]
jp JumpTable
Run Code Online (Sandbox Code Playgroud)
我的理解是第一行只是将它的其余部分放入一个名为“PalletTownScript”的标签中,只是一个稍后引用的名称。第二行检查某个事件是否发生,在另一个文件中有详细说明。到目前为止一切都很好。第三行对我来说变得复杂了。我确定“jr”跳转到脚本的另一部分,然后返回这里?我认为?但是,据我所知,每个例子只有一个参数,而这一行有两个。是跳到z吗?z是什么?我已经搜索了该文件的其余部分,但没有名为 z 的部分。z 是另一个函数吗?另一个参数是 .next,据我所知,它是 PalletTownScript 部分的一个子部分。所以它在那里跳跃是有道理的(但为什么要跳跃?如果它' 就在那里,难道它不就这样做了吗?)但我仍然不知道“z”在那里做什么。在 .next 中,它正在调用一些东西并加载一些其他东西,这一切都很好,但最后,它跳转到另一个文件中的 JumpTable(我假设在它全部编译后无关紧要,所以我我不关心那个),但它是否仍然跳转到 .next,然后再次跳转到 JumpTable?什么时候回去做那个SetEvent?之后它去哪里了?我不关心那个),但它是否仍然跳转到 .next,然后再次跳转到 JumpTable?什么时候回去做那个SetEvent?之后它去哪里了?我不关心那个),但它是否仍然跳转到 .next,然后再次跳转到 JumpTable?什么时候回去做那个SetEvent?之后它去哪里了?
我以前从未处理过 Assembly,这对我来说都非常混乱,所以如果有人能给我一些帮助,我将不胜感激。谢谢!
对于家庭作业,我必须尝试使用缓冲区溢出来使简单的c程序崩溃。我的问题是我的编译器不会编译该gets()函数,因为它已被弃用且不安全。我理解这一点,但是为了举例说明,我想重写它。这是代码:
#include <stdio.h>
int main(int argc, char *argv[]) {
int valid = 0;
// Char arrays w/buffer set to 8 chars
char str1[8];
char str2[8];
next_tag(str1);
//This is where I want to use gets and not fgets or other secure functions...
gets(str2);
if(strncmp(str1, str2, 8) == 0) {
valid = 1;
}
// Print
printf("Buffer 1: str1(%s), str2(%s), valid(%d)\n", str1, str2, valid);
}
Run Code Online (Sandbox Code Playgroud)
我的gcc版本是:
rabbitfighter @ ECHO:[〜/代码/ C / BufferOverflowExamples]:gcc -v 使用内置规格。 COLLECT_GCC = gcc COLLECT_LTO_WRAPPER = / …
我现在还在学习装配.其余的代码在我理解之下并且宁愿自己解决,但涉及右移(shrl)的行是我不明白的.0x1if(4(%rsp)是什么意思?谢谢!
400783: 89 7c 24 ec mov %edi,-0x14(%rsp)
400787: c7 44 24 fc 00 00 00 movl $0x0,-0x4(%rsp)
40078e: 00
40078f: eb 14 jmp 4007a5 <f3+0x22>
400791: 8b 44 24 ec mov -0x14(%rsp),%eax
400795: 83 e0 01 and $0x1,%eax
400798: 85 c0 test %eax,%eax
40079a: 74 05 je 4007a1 <f3+0x1e>
40079c: 83 44 24 fc 01 addl $0x1,-0x4(%rsp)
**4007a1: d1 6c 24 ec shrl -0x1if (4(%rsp)***
4007a5: 83 7c 24 ec 00 cmpl $0x0,-0x14(%rsp)
4007aa: 75 e5 jne 400791 <f3+0xe> …Run Code Online (Sandbox Code Playgroud) 我需要一个程序来计算.txt或.c文件的行,并返回以下内容:
文件:
简单注释:N行
多行注释:N行
总行数:N行
我有这个:
if (pFile != NULL)
{
do {
c = fgetc(pFile);
if (c == '\n') n++;
} while (c != EOF);
Run Code Online (Sandbox Code Playgroud)
我不知道如何实现其余部分.
我也尝试使用strstr()函数,但也没有得到它.
这个答案是怎么来的
#include<stdio.h>
#include<conio.h>
int main() {
int i, sum;
for (i = 0, sum = 0; i < 10; i++)
sum += i;
printf("%d", & sum);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
产量
2358648
Run Code Online (Sandbox Code Playgroud) 我是C++的新手.这是我的程序,总结两个3x3矩阵,我只是不知道如何退出while循环,似乎我只能退出for循环.请帮忙.这是我的代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
int main() {
double a[3][3];
double b[3][3];
char str[40];
int step = 1;
double resultan;
while (1) {
for(int i=1; i<=3; i++) {
for(int j=1; j<=3; j++) {
if (step==1) {
printf("Enter value of matrix a row %d column %d = ", i, j);
scanf("%lf", &a[i][j]);
}
if (step==2) {
printf("Enter value of matrix b row %d column %d = ", i, j);
scanf("%lf", &b[i][j]);
}
if (step==3) {
resultan = …Run Code Online (Sandbox Code Playgroud) 好吧,我从来没有尝试过for循环.我想将for循环增加8而不是一般的后增量.我正在尝试这样的事情.
for(U8 i=3;i<=31;i+8,j++){
Array[j]=(Status>>i) ;
if (j>3){
j = 0;
}
}
Run Code Online (Sandbox Code Playgroud)
好吧它给了我警告,就像逗号表达式的左手操作数没有效果.这个警告是什么意思?我的逻辑会起作用吗?status包含我系统的32位信息,我需要特殊的位.
如何在C编程语言中的一个函数中同时返回两个整数类型值,还是应该编写两个不同的函数?