memset没有设置num字节?

时间:2013-02-03 17:43:34

标签: c gdb memset

在下面的简单程序中,命令指向堆上的400个字节。然后我将“./search”复制到命令,*缓冲区指向“'”之后的下一个字节(单引号)。启动缓冲区指向的内存我使用memset将300字节设置为值0x41(ASCII'A'),然后我附加结束单引号。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>

int main(int argc, char *argv[]) {
    char *command = (char *)malloc(400);
    bzero(command, 400);

    strcpy(command, "./search \'");
    char *buffer = command + strlen(command);

    memset(buffer, 0x41, 300);
    strcat(command, "\'");

    system(command);
    free(command);
}

但是当我在gdb中查看* command和* buffer时,这就是我所看到的。

char * command 0x601010 "./search '", 'A' <repeats 186 times>...
char * buffer  0x60101e 'A' <repeats 200 times>...

首先我期待它重复299次,然后我希望命令和缓冲区重复具有相似的价值。有人可以告诉我我错过了什么吗?

2 个答案:

答案 0 :(得分:4)

来自GDB manual, section 10.8 Print Settings

设置打印元素数量元素

设置数组gdb将打印多少元素的限制。如果gdb正在打印一个大型数组,它会在打印set print elements命令设置的元素数后停止打印。此限制也适用于字符串的显示。当gdb启动时,此限制设置为200.将元素数设置为零意味着打印无限制。

答案 1 :(得分:0)

检查你的假设:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>

int main(int argc, char *argv[]) {
    char *command = (char *)malloc(400);
    bzero(command, 400);

    strcpy(command, "./search \'");
    char *buffer = command + strlen(command);

    memset(buffer, 0x41, 300);
    strcat(command, "\'");
    int last = -1;
    int n = 0;
    for (int i = 0; i < 400; i++) {
        if (n && command[i] != last) {
            printf("%d %d x %02x '%c'\n", i - n, n, last, last);
            n = 1;
        } else {
            n++;
        }
        last = command[i];
    }
    printf("%d %d x %d '%c'\n", 400 - n, n, last, last);
    return 0;
}

生成此输出:

0 1 x 2e '.'
1 1 x 2f '/'
2 1 x 73 's'
3 1 x 65 'e'
4 1 x 61 'a'
5 1 x 72 'r'
6 1 x 63 'c'
7 1 x 68 'h'
8 1 x 20 ' '
9 1 x 27 '''
10 300 x 41 'A'
310 1 x 27 '''
311 89 x 0 ''

这看起来是正确的,并且不同意问题中的诊断。因此,要么gdb被破坏,要么在释放它们之后查看字节。