0

当我删除“int e = 0;”时,我在 c 中有以下程序 我得到段错误,有人知道为什么吗?它甚至没有被使用?

第二件事是这里获得前 3 个 int 的最佳方法是什么?我正在使用 memcpy,但第一个不能正常工作。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int test()
{    
unsigned char string1[] = {0xce,0x01,0x00,0x00,0xe9,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x74,0x65,0x73,0x74};
//0xce,0x01,0x00,0x00 this should be the first int
//0xe9,0x00,0x00,0x00 Second int
//0x01,0x00,0x00,0x00 third int, the rest is the text "test"
    int e = 0;// when I comment this one I get Segmentation fault 
    unsigned int int1 = 0;
    unsigned int int2 = 0;
    unsigned int int3 = 0;
    int length = 0;
    int size = 0;
    size = sizeof(length);
    memcpy(&int1, string1, length); printf("%d\n",int1); //should be 461
    length += size;
    memcpy(&int2, &string1[length], length);  printf("%d\n",int2); //shoud be 233
    length += size;
    memcpy(&int3, &string1[length], length);  printf("%d\n",int3); //should be 1 
    length += size;
    printf("%s\n",&string1[length]);//text should be test

}

int main()
{
test();
}

当“int e = 0;”时输出低于 存在

0
233
1
test

当“int e = 0;”时输出低于 被评论

0
233
1
Segmentation fault (core dumped)
4

3 回答 3

3

您传递零,然后sizeof (length),然后2* sizeof(length)作为 的第三个参数memcpy。这可能不是您想要的,最后一个对于您的目的地来说太大了。

使用sizeof (int1), sizeof (int2),sizeof (int3)而不是length(实际上是偏移量而不是长度),您的问题应该会消失。


请注意,正如 Floris 指出的那样,您将遇到另一个问题,因为%s在 printf 格式说明符中查找终止 NUL 字节而您没有。

于 2013-07-10T03:25:16.967 回答
2

您需要以空值终止您的字符串。当您声明e它恰好在字符串之后占据内存中的一个位置时,并为您提供空终止。您需要添加'\0'作为传入字符串中的最后一个值,一切都会好起来的......

于 2013-07-10T03:28:13.763 回答
0

内存溢出:

printf("%s\n",&string1[长度])

您的字符串未以 \0 正确终止。e=0 终止您的字符串。

此外,您使用的是长度而不是大小。

应该:

整数测试()
{    
无符号字符字符串1[] = {0xce,0x01,0x00,0x00,0xe9,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x74,0x65,0x73,0x74, 0x00};
//0xce,0x01,0x00,0x00 这应该是第一个 int
//0xe9,0x00,0x00,0x00 秒 int
//0x01,0x00,0x00,0x00 第三个int,剩下的就是文本“test”
    int e = 0;// 当我评论这个时,我得到分段错误
    无符号整数 int1 = 0;
    无符号整数 int2 = 0;
    无符号整数 int3 = 0;
    整数长度 = 0;
    整数大小 = 0;
    大小 = sizeof(unsigned int);
    memcpy(&int1, string1, 大小); printf("%d\n",int1); //应该是461
    长度 += 大小;
    memcpy(&int2, &string1[长度], 大小); printf("%d\n",int2); //应该是233
    长度 += 大小;
    memcpy(&int3, &string1[长度], 大小); printf("%d\n",int3); //应该是1
    长度 += 大小;
    printf("%s\n",&string1[length]);//文本应该被测试

}

请注意0x00string1 上的终止以及 memcpy 中使用大小而不是长度。

于 2013-07-10T03:31:50.033 回答