C#-访问轰炸机,新建进程,结束进程...(ConsoleApp)---ShinePans

各位先看一下下面的题目,看看能否给出答案以及真正了解原因。

#include "stdio.h"
#include "string.h"
#include "malloc.h"

void swap(int a,int b){
int temp;
temp = a;
a = b;
b = temp;
}

int get_int(int a){
int i = 1 + a;
return i;
}

char* get_memory0(){
char *p = (char *)malloc(sizeof(char) * 20);
strcpy(p,"hello world");
return p;
}

char* get_memory1(){
char *p = "hello world";
return p;
}

char* get_memory2(){
char p[] = "hello world";
return p;
}

int main(){
int x=4,y=3;
swap(x,y);
int z=x-y;
printf("z = %d\n",z);//问题1

z=get_int(z);
printf("z = %d\n",z);//问题2

char* c0 = get_memory0();
printf("c0 = %s\n",c0);//问题3

const char* c1 = get_memory1();
printf("c1 = %s\n",c1);//问题4

char* const c2 = get_memory2();
printf("c2 = %s\n",c2);//问题5
}

问题1的答案:z=1,,对于这个答案,相信很多人都不会答错,都知道a和b没有发生交换。但是理解其中的原因吗?

swap(int a,int b)是一个参数传值得函数,这就意味着函数体内的a和b是参数int a和int b的实参在函数内的 一份局部拷贝,所以a和b实际可以看成是局部变量,它们的值是由int a和int b传的实参复制而来的。函数内a和b的值得改变只在函数体内部有效,当函数体内的a和b变量离开函数作用域的时候,a和b变量就被销毁了。函数的实参值并没有发生改变,或者说自始至终没有改变过,改变的只是它们在函数体内的一份局部拷贝a和b。

问题2的答案:z=2

int get_int(int a)属于返回值是传值的函数,这就意味着函数int get_int(int a)会在函数返回处产生一个临时对象,用户存放局部变量i的值的一份拷贝(变量i的右值的拷贝),临时对象是没有名称的,这份没有名称的对象的值(右值)会存储在调用者的“栈”中。所以当i作为局部变量离开作用域后,虽然被销毁了,但它的拷贝仍然存在,并在函数返回时作为“右值”赋给“左值z”。

问题3的答案:c0=“ hello world”

函数返回的是指向“堆”内存的在指针。程序中malloc()是用于分配“堆”内存的库函数,而对于“堆”内存,只要程序中没有调用free()库函数去释放该“堆”内存,那么在程序运行期间,malloc()库函数分配的“堆”内存将一直存在。char* get_memory0()会在函数返回处产生一个队返回变量p的“左值”的拷贝,也就是在“左值”的拷贝中存储了指向“堆”的地址。作为局部变量的p,在离开了函数作用域的时候,虽然被销毁了,但函数返回的“左值”的拷贝是存在的,该拷贝存储了指向“堆”的地址,而该“堆”的值是“hello
world”。

问题4的答案:c1="hello world"

在char* p = “hello world”中,左值是 局部指针变量p,存储于函数栈上,右值是字符串常量“hello world”,存储于常量存储区。

char* get_memory 1()属于返回值是传指针的函数,这就意味着函数char* get_memory 1()会在函数返回处产生一个对返回对象的“左值”的拷贝,也就是在“左值”拷贝中存储了指向字符串常量“hello world”的地址。作为局部变量的p,在离开函数作用域的时候虽然被销毁了,但 函数返回的“左值“拷贝仍然存储了指向常量存储区的字符串常量”hello world“的地址。

问题5的答案:c2=未知

返回值是传指针,会在函数返回时产生”左值“拷贝。

函数返回的”左值“拷贝指向的是局部变量数组p[12]的首地址。当局部数组p[12]离开作用域后会被自动销毁。这时,函数返回的”左值“拷贝指向的是一个被销毁的局部变量地址。

时间: 2024-10-09 23:10:20

C#-访问轰炸机,新建进程,结束进程...(ConsoleApp)---ShinePans的相关文章

C#-訪问轰炸机,新建进程,结束进程...(ConsoleApp)---ShinePans

这个程序能够自己主动打开要打开的网址,而且自己主动结束进程,这样能够达到博文点击流量的添加 program.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace Tst { class Program { static void Main(string[] args) { for(int i=0;i<100

win7结束进程 时,提示“拒绝访问”、“没有此任务的实例运行”怎么办?

开发了个程序,创建了一个进程,但是杀不掉了,在任务管理器里面 右键--结束进程,提示"拒绝访问",或者"没有此任务实例运行" 怎么办? 直接给答案:PCHunter 具体方法: 1.打开PCHunter,在进程选项卡下面可以找到无法结束的进程,右键--强制结束,失败(这儿效果跟任务管理器下的结束时一样的) 2.这时候 右键--查看进程线程 ,然后将所有的线程给杀光光,再出来到进程选项卡下结束进程,OK 我用了整整一天半才实现,这一天半我杀不掉进程重启电脑十几次,哎

C++结束进程 并能显示其父进程

声明:有些网友有可能在CSDN博客上看到过相同的文章,因为本人有两个账号...请不要误会,均为原创 这个程序功能强大哦~~ #include <cstdio> #include <windows.h> #include <winbase.h> #include <wtypes.h> #include <tlhelp32.h> #include <psapi.h> #include <tchar.h> #include &l

【转】利用NtProtectVirtualMemory结束进程

标 题 : [原创]利用NtProtectVirtualMemory结束进程 作 者 : KiDebug 时 间 : 2011 - 07 - 13, 09 : 37 : 08 链 接 : http ://bbs.pediy.com/showthread.php?t=137067 原理很简单,用PROCESS_VM_OPERATION打开目标进程(没必要PROCESS_ALL_ACCESS),把目标进程的ntdll.dll设为不能访问 /* * [作者:KiDebug] * [空间:http://

Linux查看和结束进程命令详解

在ubuntu中,终止一个进程或终止一个正在运行的程序,一般是通过 kill .killall.pkill.xkill 等进行. ------------------------------------------------------------------- 先看两个例子: 例子一:结束某个程序,如Firefox 键入命令: pkill firefox 例子二: 结束某个进程,如find 先用ps命令来查看该进程对应的PID. 键入ps,显示如下: PID TTY TIME COMMAND

top、kill实现进程结束

在用wine时遇到打开软件后不能关闭的问题,以下是解决方案首先了解一下top命令终端输入top后显示以下内容 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 top - 13:05:54 up 2:08, 1 user, load average: 0.54, 0.5

taskkill 命令批量结束进程

taskkill /f /im PjtPkgWeightDlg.exe  结束进程 start "" "d:\PjtPkgWeightDlg.exe"  启动程序 在命令行下输入  taskkill /?  就能看到这个命令的一些介绍了. 命令语法: TASKKILL [/S system [/U username [/P [password]]]]         { [/FI filter] [/PID processid | /IM imagename] }

进程接受进程结束传递的返回码

在工程中我要实现一个这样的功能:A进程创建B进程运行,通过B进程结束时返回的错误码进行下一步的流程. 参考了一些网上的代码,最终形成了这样一份绝对可行的方案.A进程: if(CreateProcess(NULL,m_file,NULL,NULL,TRUE,CREATE_NEW_PROCESS_GROUP|CREATE_DEFAULT_ERROR_MODE,NULL,NULL,&SI,&PI)) { // Wait until child process exits. WaitForSing

进程结束后,进程的所有内存都将被释放,包括堆上的内存泄露的内存。

进程结束后,进程的所有内存都将被释放,包括堆上的内存泄露的内存.原因是,当进程结束时,GDT.LDT和页目录都被操作系统更改,逻辑内存全部消失,可能物理内存的内容还在但是逻辑内存已经从LDT和GDT删除,页目录表全部销毁,所以内存会被全部收回. 一下这段代码,我个人认为可以作为例证,不对请多指教: [c-sharp] view plaincopy #include <cstdlib> using namespace std; const static int const_once = 1024