有关一个字符串常量数组的逆向问题

genboo 2012-01-05 11:04:23

char * temp_ptr = PNULL;
temp_ptr = "ABC";

char array[30] = "ABC";

array ?= temp_ptr;



现在想实现指针变量temp_ptr,赋值给字符串数组array[30],最终数组中保存指针变量所指的字符串常量,不知能否实现?中间过程可以使用任何宏或函数变换,只要能达到目的。
...全文
179 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
li08240418 2012-01-10
  • 打赏
  • 举报
回复
纠结了
gqjjqg 2012-01-10
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 genboo 的回复:]

引用 10 楼 gqjjqg 的回复:

晕了,

#define STR "abc"
temp_ptr = STR;
array[30] = STR;


C/C++ code

#define M "abc"
#define N "123"

char * w[2]
{
"abc",
"123"
}

struct{
char a[3],
……
[/Quote]

既然stru 结构体里 分配了 a,b数组,初始化就相当于内存copy,这应该不能避免的。想要这个结构体里的东西避免这样的copy,最好就是定义成这样:


#include<stdio.h>
#define M "def"
#define N "456"

char * w[2]=
{
"abc",
"123"
};

typedef struct stru_t{
char *a;
char *b;
}stru;

stru h[2]=
{
{w[0],w[1]},
{M,N}
};

int main()
{
printf("%s\n", h[0].a);
printf("%s\n", h[0].b);
printf("%s\n", h[1].a);
printf("%s\n", h[1].b);
return 0;
}

AnYidan 2012-01-06
  • 打赏
  • 举报
回复
= 只是指针赋值
genboo 2012-01-06
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 gqjjqg 的回复:]

晕了,

#define STR "abc"
temp_ptr = STR;
array[30] = STR;

[/Quote]

#define M "abc"
#define N "123"

char * w[2]
{
"abc",
"123"
}

struct{
char a[3],
char b[3]
}stru;

stru h[2]=
{
{M,N}
}

如果这里我不能使用M,N来初始h,而要使用w来初始h,就是M地方现在要换成w,应该怎么转换呢?

genboo 2012-01-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 mscf 的回复:]
array ?= temp_ptr;

这个式子是不可能为真的,因为变量在同一个栈上,要比较只有比较指针指向的内容和数组中的内容~
[/Quote]
这里我只是一种假设,"?="中间代表的实现的方法.
c090869 2012-01-06
  • 打赏
  • 举报
回复
array的值是固定的
Defonds 2012-01-06
  • 打赏
  • 举报
回复
memcpy
gqjjqg 2012-01-06
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 mougaidong 的回复:]

引用 9 楼 genboo 的回复:

注:memcpy(array, temp_ptr, strlen(temp_ptr));//这种除外

最终想达成的目的是:

把指针变量temp_ptr怎么转化成一个宏,然后把这个宏直接赋给array[30];

类似这样:
#define M ?(temp_ptr)?
array[30] = M;


楼主的想法,是想把复杂的……
[/Quote]


楼主的意思,我实在不能领会。

temp_ptr = "ABC"; 这里分配的只读内存区域,既然都已经是只读的字符串常量,直接拿来用就好了,为什么要把内容放数组里来用?
这是我不理解的地方...

如果想要对这个temp_ptr指向的内容可以修改,就别这么定义,malloc 一块出来,爱怎么用就怎么用,最后记得free就行了。
如果想要对array[30]这个内容做修改,并且内容要和temp_ptr一样,直接copy一下再修改数组就OK了。




turing-complete 2012-01-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 genboo 的回复:]

注:memcpy(array, temp_ptr, strlen(temp_ptr));//这种除外

最终想达成的目的是:

把指针变量temp_ptr怎么转化成一个宏,然后把这个宏直接赋给array[30];

类似这样:
#define M ?(temp_ptr)?
array[30] = M;
[/Quote]

楼主的想法,是想把复杂的函数语法变成直观的 赋值操作符= ? 恐怕实现不了,还是直接调用吧,弄不好高出宏污染了。
gqjjqg 2012-01-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 genboo 的回复:]

注:memcpy(array, temp_ptr, strlen(temp_ptr));//这种除外

最终想达成的目的是:

把指针变量temp_ptr怎么转化成一个宏,然后把这个宏直接赋给array[30];

类似这样:
#define M ?(temp_ptr)?
array[30] = M;
[/Quote]

晕了,
#define STR "abc"
temp_ptr = STR;
array[30] = STR;


不就好了。
genboo 2012-01-06
  • 打赏
  • 举报
回复
注:memcpy(array, temp_ptr, strlen(temp_ptr));//这种除外

最终想达成的目的是:

把指针变量temp_ptr怎么转化成一个宏,然后把这个宏直接赋给array[30];

类似这样:
#define M ?(temp_ptr)?
array[30] = M;
yzlovme 2012-01-06
  • 打赏
  • 举报
回复
果断memcpy()
iamnobody 2012-01-05
  • 打赏
  • 举报
回复
最快的是strcpy();没别的好办法.

就算是编译器也是用memmove之类的实现的.
黯然 2012-01-05
  • 打赏
  • 举报
回复
memcpy应该就可以实现了
面包大师 2012-01-05
  • 打赏
  • 举报
回复
memcpy(array, temp_ptr, strlen(temp_ptr));//实现字符串的copy
薛定谔之死猫 2012-01-05
  • 打赏
  • 举报
回复
array ?= temp_ptr;

这个式子是不可能为真的,因为变量在同一个栈上,要比较只有比较指针指向的内容和数组中的内容~
薛定谔之死猫 2012-01-05
  • 打赏
  • 举报
回复
如果在C++中,主要重载赋值操作符就能轻松实现,在C中要实现类似功能只能定义宏了,且不能和=一致
薛定谔之死猫 2012-01-05
  • 打赏
  • 举报
回复
memcpy或strcpy族函数不就过来了嘛
《明解C语言 第3版 入门篇》是日本的C语言经典教材,自出版以来不断重印、修订,被誉为“C语言圣经”。 《明解C语言 第3版 入门篇》图文并茂,示例丰富,第3版从190段代码和164幅图表增加到205段代码和220幅图表,对C语言的基础知识进行了彻底剖析,内容涉及数组、函数、指针、文件操作等。对于C语言语法以及一些难以理解的概念,均以精心绘制的示意图,清晰、通俗地进行讲解。原著在日本广受欢迎,始终位于网上书店C语言著作排行榜首位。 第1章 初识C语言 1 1-1 显示计算结果 2 计算整数的和并显示结果 2 程序和编译 2 注释 3 固定代码 4 printf函数:格式化输出函数 4 语句 5 计算并显示整数的差 5 格式化字符串和转换说明 6 符号的称呼 8 无格式化输出 8 字符串常量 10 转义字符 10 1-2 变量 11 变量和声明 11 赋值 12 初始化 13 声明时初始化 14 初始化和赋值 14 1-3 输入和显示 16 通过键盘进行输入 16 格式化输入函数scanf 16 乘法运算 17 输出函数puts 18 总结 21 第2章 运算和数据类型 23 2-1 运算 24 运算符和操作数 24 乘除运算符和加减运算符 25 除法运算的商和余数 25 使用printf函数打印% 26 获取整数的最后一位数字 26 多个转换说明 27 单目运算符 28 赋值运算符 29 表达式和赋值表达式 30 表达式语句 30 2-2 数据类型 31 求平均值 31 数据类型 32 数据类型和对象 33 整型常量和浮点型常量 34 double类型的运算 34 数据类型和运算 35 类型转换 37 转换说明 39 总结 42 第3章 分支结构程序 45 3-1 if语句 46 if语句·其1 46 奇数的判定 47 if语句·其2 48 奇数·偶数的判断 49 非0的判断 49 if语句的结构图 50 相等运算符 52 余数的判断 53 关系运算符 54 嵌套的if语句 55 判断 57 计算较大值 58 计算三个数的最大值 59 条件运算符 60 差值计算 61 复合语句(程序块) 62 逻辑运算符 65 短路求值 67 3-2 switch语句 70 switch语句和break语句 70 复杂的switch语句 72 switch语句和if语句 73 选择语句 74 总结 75 第4章 程序的循环控制 77 4-1 do语句 78 do语句 78 复合语句(程序块)中的声明 79 读取一定范围内的值 80 逻辑非运算符·德摩根定律 81 德摩根定律 81 求多个整数的和及平均值 82 复合赋值运算符 84 后置递增运算符和后置递减运算符 85 4-2 while语句 87 while语句 87 用递减运算符简化程序代码 88 数据递增 90 限定次数的循环操作 91 字符常量和putchar函数 92 do语句和while语句 93 前置递增运算符和前置递减运算符 93 do语句的显示 95 逆向显示整数值 96 4-3 for语句 99 for语句 99 使用for语句实现固定次数的循环 101 偶数的枚举 103 约数的枚举 104 表达式语句和空语句 104 循环语句 105 4-4 多重循环 107 二重循环 107 用break语句强制结束循环 108 显示图形 109 多重循环 111 4-5 程序的组成元素和格式 114 关键字 114 运算符 114 标识符 114 分隔符 115 常量字符串常量 115 自由的书写格式 116 连接相邻的字符串常量 117 缩进 117 总结 118 第5章 数组 121 5-1 数组 122 数组 122 数组的声明(使用数组前的准备) 123 访问数组数组的使用方法) 123 数组的遍历 124 数组初始化 126 数组的复制 127 输入数组元素的值 129 对数组的元素进行倒序排列 129 使用数组进行成绩处理 131 对象式宏 131 数组元素的最大值和最小值 133 赋值表达式的判断 134 数组的元素个数 135 5-2 多维数组 138 多维数组 138 总结 142 第6章 函数 145 6-1 什么是函数 146 main函数和库函数 146 什么是函数 146 函数定义 147 函数调用 148 三个数中的最大值 151 将函数的返回值作为参数传递给函数 152 调用其他函数 154 值传递 155 6-2 函数设计 158 没有返回值的函数 158 通用性 159 不含形参的函数 160 函数返回值的初始化 161 作用域 161 文件作用域 162 声明和定义 163 函数原型声明 163 头文件和文件包含指令 164 函数的通用性 165 数组的传递 166 函数的传递和const类型的修饰符 168 线性查找(顺序查找) 170 哨兵查找法 172 多维数组的传递 175 6-3 作用域和存储期 178 作用域和标识符的可见性 178 存储期 180 总结 185 第7章 基本数据类型 189 7-1 基本数据类型和数 190 算数类型和基本数据类型 190 基数 191 基数转换 192 7-2 整型和字符型 195 整型和字符型 195 头文件 196 字符型 199 位和CHAR_BIT 200 sizeof运算符 200 size_t型和typedef声明 202 整型的灵活运用 202 整型的内部表示 204 无符号整数的内部表示 205 有符号整数的内部表示 207 按位操作的逻辑运算 209 位移运算符 212 整型常量 216 整型常量的数据类型 218 整数的显示 218 数据溢出和异常 220 7-3 浮点型 221 浮点型 221 浮点型常量 223 头文件 224 循环的控制 225 7-4 运算和运算符 228 运算符的优先级和结合性 228 优先级 228 结合性 228 数据类型转换 230 总结 232 第8章 动手编写各种程序吧 235 8-1 函数式宏 236 函数和数据类型 236 函数式宏 237 函数和函数式宏 238 不带参数的函数式宏 239 函数式宏和逗号运算符 240 8-2 排序 243 冒泡排序法 243 8-3 枚举类型 246 枚举类型 246 枚举常量 248 命名空间 250 8-4 递归函数 251 函数和类型 251 阶乘 252 8-5 输入输出和字符 255 getchar函数和EOF 255 从输入复制到输出 256 数字字符计数 256 字符 258 转义字符 261 总结 263 第9章 字符串的基本知识 265 9-1 什么是字符串 266 字符串字面量 266 字符串字面量的长度 266 字符串 268 字符数组的初始化赋值 269 空字符串 270 字符串的读取 270 格式化显示字符串 271 9-2 字符串数组 273 字符串数组 273 读取字符串数组中的字符串 274 9-3 字符串处理 275 字符串长度 275 显示字符串 277 数字字符的出现次数 278 大小写字符转换 279 字符串数组的参数传递 280 总结 283 第10章 指针 285 10-1 指针 286 函数的参数 286 对象和地址 287 取址运算符 288 指针 289 指针运算符 291 10-2 指针和函数 293 作为函数参数的指针 293 计算和与差 294 二值互换 296 将两个值排序 297 scanf函数和指针 298 指针的类型 299 空指针 300 标量型 301 10-3 指针和数组 302 指针和数组 302 指针运算符和下标运算符 304 数组和指针的不同点 306 数组的传递 308 总结 311 第11章 字符串和指针 315 11-1 字符串和指针 316 用数组实现的字符串和用指针实现的字符串 316 用数组实现的字符串和用指针实现的字符串的不同点 318 字符串数组 320 11-2 通过指针操作字符串 323 判断字符串长度 323 字符串的复制 325 不正确的字符串复制 328 返回指针的函数 329 11-3 字符串处理库函数 330 strlen函数:求字符串的长度 330 strcpy函数、strncpy函数:复制字符串 331 strcat函数、strncat函数:连接字符串 332 strcmp函数、strncmp函数:比较字符串的大小关系 332 atoi函数、atol函数、atof函数:转换字符串 333 总结 336 第12章 结构体 339 12-1 结构体 340 数据关联性 340 结构体 342 结构体成员和运算符 344 成员的初始化 345 结构体成员和->运算符 346 结构体和typedef 348 结构体和程序 350 聚合类型 351 返回结构体的函数 351 命名空间 353 结构体数组 353 派生类型 355 12-2 作为成员的结构体 356 表示坐标的结构体 356 具有结构体成员的结构体 357 总结 361 第13章 文件处理 363 13-1 文件与流 364 文件与流 364 标准流 365 FILE型 365 打开文件 365 关闭文件 368 打开与关闭文件示例 369 文件数据汇总 370 写入日期和时间 372 获取上一次运行时的信息 376 显示文件内容 378 文件的复制 380 13-2 文本和二进制 382 在文本文件中保存实数 382 文本文件和二进制文件 383 在二进制文件中保存实数 384 显示文件自身 386 13-3 printf函数与scanf函数 389 printf函数:带格式输出 389 scanf函数:带格式的输入 393 总结 397 附录 C语言简介 399 C语言的历史 400 K&R——C语言的圣经 400 C语言标准规范 400 结语 402 参考文献 405
内容简介   《揭秘数据解密的关键技术》[1]是一本以游戏资源文件格式为研究对象的数据逆向工程的技术书籍,主要讲解如何分析和研究自定义文件格式的数据结构。《揭秘数据解密的关键技术》内容包含反汇编的阅读和理解,数据在计算机中的存储原理,常用媒体格式的解析,加密和解密的识别和分析,数据压缩的特征识别,打包文件格式的识别和游戏窗口化的方法。《揭秘数据解密的关键技术》对每一个问题都给出了详细和完整的分析过程,力求用最通俗和简单的方法让读者学会分析和研究自定义文件格式。《揭秘数据解密的关键技术》适合对数据解密、游戏资源提取、软件逆向工程感兴趣的读者以及广大编程爱好者阅读。 编辑本段作者简介   刘颖东,网名“小猫”,擅长逆向工程与游戏开发,从接触反汇编开始便一发不可收拾,对操作系统底层控制有强烈的征服欲望,现致力于嵌入式操作系统的开发。 编辑本段编辑推荐   《揭秘数据解密的关键技术》告诉您:。《揭秘数据解密的关键技术》内容包含反汇编的阅读和理解,数据在计算机中的存储原理,常用媒体格式的解析,加密和解密的识别和分析,数据压缩的特征识别,打包文件格式的识别和游戏窗口化的方法。《揭秘数据解密的关键技术》对每一个问题都给出了详细和完整的分析过程,力求用最通俗和简单的方法让读者学会分析和研究自定义文件格式 编辑本段目录   第1章 走进数据解密   1.1 数据解密是什么   1.1.1 代码逆向工程和数据逆向工程   1.2 数据解密的方法   1.2.1 黑盒分析法   1.2.2 白盒分析法   1.2.3 黑盒分析法与白盒分析法的比较   1.3 万能的汇编语言   1.3.1 为什么选择汇编语言   1.3.2 16位和32位的80x86汇编语言   1.4 通用寄存器   1.4.1 EAX、EBX、ECX和EDX寄存器   1.4.2 EAX、EBX、ECX和EDX寄存器的用途   1.5 变址寄存器   1.5.1 ESI和EDI寄存器   1.5.2 ESI和EDI寄存器的用途   1.6 指针寄存器   1.6.1 EBP和ESP寄存器   1.6.2 EBP和ESP寄存器的用途   1.7 标志寄存器   1.7.1 EFLAGS寄存器   1.7.2 EFLAGS寄存器的用途   1.8 灵活的寻址方式   1.8.1 寻址方式的分类   1.8.2 高级语言中的数据结构和80386寻址方式的关系   1.9 80386指令   1.9.1 Intel格式和AT&T格式的指令   1.9.2 数据传送指令MOV、XCHG、PUSH、POP   1.9.3 地址传送指令   1.9.4 算数运算指令   1.9.5 逻辑运算指令   1.9.6 移位指令   1.9.7 条件转移指令   1.9.8 函数调用指令   1.1 0函数调用约定   1.1 0.1 3种常用的调用约定   1.1 0.2 调用约定的参数传递顺序   1.1 1字节码   1.1 1.1 代码和数据的区别   1.1 1.2 PE文件   第2章 识别汇编代码的高级模式   2.1 汇编中的常量、指针和变量——C语言中的常量、指针和变量   2.1.1 常量、指针和变量的定义   2.1.2 常量、指针和变量的实现机制   2.2 汇编中的字符串——C语言中的字符串   2.2.1 字符串的定义   2.2.2 字符串的实现机制   2.3 汇编中的数组——C语言中的数组   2.3.1 数组的定义   2.3.2 数组的实现机制   2.3.3 二维数组的实现机制   2.4 汇编中的结构体——C语言中的结构体   2.4.1 结构体的定义   2.4.2 结构体的实现机制   2.5 汇编中的条件分支语句——C语言中的条件分支语句   2.5.1 条件分支语句的定义   2.5.2 if的实现机制   2.5.3 包含复杂表达式的if语句的实现机制   2.5.4 switch语句的实现机制   2.6 汇编中的循环——C语言中的循环   2.6.1 循环的定义   2.6.2 while语句的实现机制   2.6.3 do...while语句实现机制   2.6.4 for语句的实现机制。。。。。。。

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧