- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在练习用 C 编写的客户端-服务器应用程序。在该应用程序中,客户端首先向服务器注册并获得 client_id
作为返回。下一次,客户端将消息发送到服务器,并在消息前加上 client_id
。以下代码片段来自服务器,服务器收到消息后,从消息中获取client_id
,这是一个3字符长的字符串,起始地址为1,结束地址为4大批。例如。在消息 "1001CLIENT:001:MESSAGE:01"
中,位置 0 处的 '1' 用于某种目的,"001"是 client_id
和 "CLIENT :001:MESSAGE:01"
是来自客户端的消息。
char *create_dynamic_string(int str_size)
{
char *dyn_string = malloc(str_size*sizeof(char));
if(!dyn_string)
{
printf("Dynamic string could not be created");
return NULL;
}
dyn_string[0] = '\0';
return dyn_string;
}
void free_dynamic_string(char *dyn_string)
{
free(dyn_string);
}
//char *message is dynamically allocated char array.
char *retrieve_client_id(char *message)
{
char *client_id;
int i;
client_id = create_dynamic_string(CLIENT_ID_SIZE + 1);
if(!client_id)
{
printf("Client_id is NULL");
return NULL;
}
//for(i = 1; i < (CLIENT_ID_SIZE + 1); i++)
// client_id[i-1] = message[i];
//strncpy(client_id, message + 1, CLIENT_ID_SIZE);
memcpy(client_id, message + 1, CLIENT_ID_SIZE);
client_id[CLIENT_ID_SIZE] = '\0';
printf("client_id retrieved=%s", client_id);
return client_id;
}
服务器接受来自客户端的连接并在不同的线程中处理消息。多线程和消息处理的工作已成功测试。下面的代码编译成功并且大部分时间都有效。但有时它会在 retrieve_client_id()
中的 memcpy()
处出现段错误。我无法弄清楚为什么它会以这种方式失败。
我使用 gdb
来获取更多信息。如下所示。
Program terminated with signal 11, Segmentation fault.
#0 0x00000000004017ef in retrieve_client_id (message=0x1b904f40 "1000CLIENT:000:MESSAGE:02") at src/server.c:46
46 memcpy(client_id, message + 1, CLIENT_ID_SIZE);
(gdb) print message
$1 = 0x1b904f40 "1000CLIENT:000:MESSAGE:02"
(gdb) print message+1
$2 = 0x1b904f41 "000CLIENT:000:MESSAGE:02"
(gdb) print CLIENT_ID_SIZE
$3 = 3
(gdb) print client_id
$4 = 0xffffffffcc0008c0 <Address 0xffffffffcc0008c0 out of bounds>
(gdb)
需要帮助来理解当应用程序失败时究竟会发生什么。我已验证 malloc
成功并且 client_id
不为 NULL。如您所见的注释代码,我还尝试使用 strcpy()
并将字符从源数组一一复制到目标数组。但我也看到了失败。
最佳答案
我猜测 create_dynamic_string
和 retrieve_client_id
在不同的编译单元中,并且在编译后者时您没有正确的前者可见原型(prototype)。
这个地址 0xffffffffcc0008c0
看起来像一个合理的堆地址 0xcc0008c0
添加了额外的位。
添加这一行:
extern char *create_dynamic_string(int);
就在 retrieve_client_id
的定义之上。
如果这解决了问题(它应该),那么将 create_dynamic_string
的原型(prototype)添加到适当的头文件中,并将其 #include
添加到定义 retrieve_client_id 的源代码中
。
I did not understand why it did not give compilation error
在 C 中,假定未声明的函数具有以下原型(prototype):
int undeclared(...);
因此,以下任何调用都不会被拒绝:
int x = undeclared();
int y = undeclared(1);
char *z = undeclared(1, 2, 3);
您可以要求 GCC 警告您缺少原型(prototype),特别是-Wmissing-prototypes
,但最佳做法是使用-Wall
进行编译> 和 -Werror
。后者不会让您忽略警告并强制您修复它们。
还建议添加 -Wextra
,尽管它有时会给出误报警告。
关于c - 将字符串复制到 malloc 的 char 数组中失败并出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31922115/
我的应用程序从一个有 5 个选项卡的选项卡栏 Controller 开始。一开始,第一个出现了它的名字,但其他四个没有名字,直到我点击它们。然后根据用户使用的语言显示名称。如何在选项卡栏出现之前设置选
我有嵌套数组 json 对象(第 1 层、第 2 层和第 3 层)。我的问题是数据表没有出现。任何相关的 CDN 均已导入。该表仅显示部分。我引用了很多网站,但都没有解决我的问题。 之前我使用标准表来
我正在尝试设置要显示的 Parse PFLoginViewController。这是我的一个 View Controller 的类。 import UIKit import Parse import
我遇到了这个问题,我绘制的对象没有出现在 GUI 中。我知道它正在被处理,因为数据被推送到日志文件。但是,图形没有出现。 这是我的一些代码: public static void main(Strin
我有一个树状图,其中包含出现这样的词...... TreeMap occurrence = new TreeMap (); 字符串 = 单词 整数 = 出现次数。 我如何获得最大出现次数 - 整数,
因此,我提示用户输入变量。如果变量小于 0 且大于 10。如果用户输入 10,我想要求用户再次输入数字。我问时间的时候输入4,它说你输入错误。但在第二次尝试时效果很好。例如:如果我输入 25,它会打印
我已经用 css overflow 属性做了一个例子。在这个例子中我遇到了一个溢出滚动的问题。滚动条出现了,但没有工作意味着每当将光标移动到滚动条时,在这个滚动条不活动的时间。我对此一无所知,所以请帮
我现在正在做一个元素。当您单击一个元素时,会出现以下信息,我想知道如何在您单击下一个元素而不重新单击同一元素时使其消失....例如,我的元素中有披萨,我想单击肉披萨看到浇头然后点击奶酪披萨看到浇头和肉
我有一个路由器模块,它将主题与正则表达式进行比较,并将出现的事件与一致的键掩码链接起来。 (它是一个简单的 url 路由过滤,如 symfony http://symfony.com/doc/curr
这个问题在这里已经有了答案: 9年前关闭。 Possible Duplicate: mysql_fetch_array() expects parameter 1 to be resource, bo
我在底部有一个带有工具栏的 View ,我正在使用 NavigationLink 导航到该 View 。但是当 View 出现时,工具栏显示得有点太低了。大约半秒钟后,它突然跳到位。它只会在应用程序启
我试图在我的应用程序上为背景音乐添加一个 AVAudioPlayer,我正在主屏幕上启动播放器,尝试在应用程序打开时开始播放但出现意外行为... 它播放并立即不断创建新玩家并播放这些玩家,因此同时播放
这是获取一个数字,获取其阶乘并将其加倍,但是由于基本情况,如果您输入 0,它会给出 2 作为答案,因此为了绕过它,我使用了 if 语句,但收到错误输入“if”时解析错误。如果你们能提供帮助,我真的很感
暂停期间抛出异常 android.os.DeadObjectException 在 android.os.BinderProxy.transactNative( native 方法) 在 androi
我已经为猜词游戏编写了一些代码。它从用户输入中读取字符并在单词中搜索该字符;根据字符是否在单词中,程序返回并控制一些变量。 代码如下: import java.util.Random; import
我是自动化领域的新手。这是我的简单 TestNG 登录代码,当我以 TestNG 身份运行该代码时,它会出现 java.lang.NullPointerException,双击它会突出显示我导航到 U
我是c#程序员,我习惯了c#的封装语法和其他东西。但是现在,由于某些原因,我应该用java写一些东西,我现在正在练习java一天!我要创建一个为我自己创建一个虚拟项目,以便让自己更熟悉 Java 的
我正在使用 Intellij,我的源类是 main.com.coding,我的资源文件是 main.com.testing。我将 spring.xml 文件放入资源文件中。 我的测试类位于 test.
我想要我的tests folder separate到我的应用程序代码。我的项目结构是这样的 myproject/ myproject/ myproject.py moduleon
这个问题已经有答案了: What is a NullPointerException, and how do I fix it? (12 个回答) 已关闭 6 年前。 因此,我尝试比较 2 个值,一个
我是一名优秀的程序员,十分优秀!