weixin_45569460 2020-01-13 09:08 采纳率: 0%
浏览 641

在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;
}

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

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

  • 写回答

2条回答 默认 最新

  • Kim_小星兴 2020-01-13 09:21
    关注

    首先~你的代码里

          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 的作用以及 返回值 你肯定可以知道答案;

    评论

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog