访问指针C指向的值

时间:2014-05-26 20:27:52

标签: c pointers memory access-violation

我有以下代码:

    char * transfer_encoding;
    char coso;
    if (transfer_encoding = strstr(first_chunk.content, "Transfer-Encoding:")){

        coso = *(transfer_encoding + 18);
        printf(" %s ", coso);
}

它只搜索字符串“Transfer-Encoding:”,然后尝试访问“:”之后的值(18 = len(“Transfer-Encoding:”))。它给我一个读取地址0x0000020的访问冲突。为什么? 我想在“Transfer-Encoding”之后遍历字节以找到“\ r \ n”。

澄清问题。我想通过“Transfer-Encoding”之后的字节来查找“\ r \ n”。我该怎么做? 谢谢。

3 个答案:

答案 0 :(得分:1)

您在Transfer-Encoding:

之后获取地址
transfer_encoding + 18

取消引用

coso = *(transfer_encoding + 18);

并尝试将其解释为字符串

printf(" %s ", coso);

正确的方法是

printf(" %s ", transfer_encoding + 18);

没有解除引用它。


地址0x0000020来自冒号后面的字符,通常是空格。这是ASCII中的320x20


如果要查看该地址的内容,取消引用指针是完全有效的,例如

char cr = *(transfer_encoding + 18);
char nl = *(transfer_encoding + 18 + 1);
if (cr == '\r' && nl = '\n')
    printf("CRLF found\n");

要比较整个字符串,您还可以使用strcmpstrncmp

if (strncmp(transfer_encoding + 18, "\r\n", 2) == 0)
    printf("CRLF found\n");

答案 1 :(得分:0)

编译器可能会警告你这个代码。

你在结肠后拿着角色而不是指向那里:

char *transfer_encoding;
char *coso;
if (transfer_encoding = strstr(first_chunk.content, "Transfer-Encoding:"))
{
    coso = transfer_encoding + 18;
    printf(" %s ", coso);

答案 2 :(得分:0)

当内容中不存在字符串“Transfer-Encoding:”时,函数strstr返回null,当发生这种情况时,您会收到访问冲突。尝试检查指针是否为空,然后继续这样:

   char * transfer_encoding;
   char * coso;
   if ((transfer_encoding = strstr(first_chunk.content, "Transfer-Encoding:"))){
     if (transfer_encoding != NULL){
        coso = transfer_encoding + 18;
        printf(" %s ", coso);
     }
   }

希望它有所帮助!

编辑:很好,那么你的指针有另一个问题,你明确地从字符串中取出1个字符而不是指向字符串中剩下的任何内容,请再试一次