在linux下运行c语言代码出现这种段错误的原因。

1.当将lockId代码块放在后面时会出现段错误。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#include "packag_server.h"

#define DATA_LEN 500

char *Login_post_reply(char *msg)
{
    char *productId = malloc(DATA_LEN); 
    char *featureId = malloc(DATA_LEN);
    char *lockId = malloc(DATA_LEN);
    char *t = malloc(DATA_LEN);



    productId = strstr(msg, "productId");
    productId += 11;
    t = strstr(productId, ",");
    *t = '\0';
    printf("productId = %s\n",productId);

    featureId = strstr(msg, "featureId");
    featureId += 11;
    t = strstr(featureId, ",");
    *t = '\0';
    printf("featureId = %s\n",featureId);

    lockId = strstr(msg, "lockId");
    lockId += 9;
    t = strstr(lockId, "\"");
    *t = '\0';
    printf("lockId = %s\n",lockId);

    printf("productId = %s  featureId = %s  lockId = %s\n",productId, featureId, lockId);
    /* if(qp(productId, featureId, lockId))
    {

    } */
}

int main()
{
    char data[] = "{ \n"
    "   id\": 12345,\n"
    "   featureId\": 0,\n"
    "   productId\": 0,\n"
    "   lockId\":\"123456\",\n"
    "   sign\":\"7f383431123232\",\n"
    "   method\":\n\"Login_post\"\n"
    "}\n";
    Login_post_reply(data);
    //printf("data = %s\n",data);
    return 0;
}

编译后执行结果如下:
图片说明

2.将lockId代码块放在首位能够正常执行。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#include "packag_server.h"

#define DATA_LEN 500

char *Login_post_reply(char *msg)
{
    char *productId = malloc(DATA_LEN); 
    char *featureId = malloc(DATA_LEN);
    char *lockId = malloc(DATA_LEN);
    char *t = malloc(DATA_LEN);

    lockId = strstr(msg, "lockId");
    lockId += 9;
    t = strstr(lockId, "\"");
    *t = '\0';
    printf("lockId = %s\n",lockId);

    productId = strstr(msg, "productId");
    productId += 11;
    t = strstr(productId, ",");
    *t = '\0';
    printf("productId = %s\n",productId);

    featureId = strstr(msg, "featureId");
    featureId += 11;
    t = strstr(featureId, ",");
    *t = '\0';
    printf("featureId = %s\n",featureId);

    printf("productId = %s  featureId = %s  lockId = %s\n",productId, featureId, lockId);
    /* if(qp(productId, featureId, lockId))
    {

    } */
}

int main()
{
    char data[] = "{ \n"
    "   id\": 12345,\n"
    "   featureId\": 0,\n"
    "   productId\": 0,\n"
    "   lockId\":\"123456\",\n"
    "   sign\":\"7f383431123232\",\n"
    "   method\":\n\"Login_post\"\n"
    "}\n";
    Login_post_reply(data);
    //printf("data = %s\n",data);
    return 0;
}

编译后执行结果如下:
图片说明

这种段错误的原因是什么?

首先~你的代码里

      char *productId = malloc(DATA_LEN); 
    char *featureId = malloc(DATA_LEN);
    char *lockId = malloc(DATA_LEN);
    char *t = malloc(DATA_LEN);

申请的内存都没用到;

其次

strstr这个函数的意思和他怎么识别字符串的原理你没有搞清楚;
strstr的功能和返回值是什么你可以网上百度查一下;如果你还没搞懂评论下我继续问.

识别字符串是怎么识别的呢?

我们都知道 char a[7]="abcefg";是一个字符串,但是这里只有6个字符为什么字符数组要给7?,因为要留一个位置给结束标志,也就是 '\0',
如果我们后期 把 a[5] = '\0'; 了,那么我们printf("%s",a)的时候我们就会发现只打印了 "abcd"出来因为** 字符串结束是以它看到的第一个'\0'为标准的**

所以你仔细看你前面的代码 是不是 "productId" 在 "lockId"前面??? 结合你自己网上自己搜索到的strstr 的作用以及 返回值 你肯定可以知道答案;

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^