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 教务系统账号被盗号如何追溯设备
  • ¥20 delta降尺度方法,未来数据怎么降尺度
  • ¥15 c# 使用NPOI快速将datatable数据导入excel中指定sheet,要求快速高效
  • ¥15 再不同版本的系统上,TCP传输速度不一致
  • ¥15 高德地图点聚合中Marker的位置无法实时更新
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式