- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我遇到了一个很奇怪的问题,
我有以下代码:
typedef struct{
char *a;
char *b;
char *c;
}Str;
typedef struct{
int size;
str array[]; //flexible array.
}strArr;
此处的目的是从realloc 中为新元素分配a、b 和c。
StrArr *arr;
int arrSize;
arrSize = 1;
arr = malloc(sizeof(strArr)+sizeof(int)*arrSize);
arr->size++;
arr = realloc(arr, sizeof(strArr)+sizeof(int)*arr->size);
arr->array[arr->size-1].a = malloc(sizeof(char)*75);
arr->size++;
card = realloc(arr, sizeof(strArr)+sizeof(int)*arr->size);
问题是:每当 arr
被重新分配为更大的一个时,您是否必须为新元素的字符串分配内存?如果运行此代码,它将失败,因为它给我 glibc detected at the second realloc
。我究竟做错了什么? 如果我去掉中间的 malloc 语句,它就会运行。
另外,如果我尝试将 strcpy 放入 arr->array[arr->size-1].a,它会出现段错误。
如有任何帮助,我们将不胜感激。谢谢。
最佳答案
这段代码有很多问题,足以表明您遇到的任何问题都无法重现。尽管如此,仍有足够的问题导致不稳定(即分段违规)。我假设您打算在 str
中使用小写的 s
而不是在 Str
中使用大写的 S
;只有这样才有意义。对于 strArray
中的小写 s
(应该是)也是如此。
为了使 arr->size++;
有用,您在什么时候为 arr->size
分配了一个值?这本身就是一个错误,但与另一个错误交织在一起:
arr = realloc(arr, sizeof(strArr)+sizeof(int)*arr->size);
事实证明这是一个主要问题,因为您继续在关键逻辑部分中使用未初始化的变量,一次又一次,然而,一旦该问题得到解决,这里的下一个错误是:
任何类似于 X = realloc(X, Y);
模式的东西都是可疑的。它是 X
es。那些应该是不同的。您不应该像那样替换值。我的意思是,它会工作,有点......但正确地完成它并不需要更多的努力,除非正确地完成,否则这不会是 valgrind
-友好的。这对您来说应该很重要,因为 valgrind
是帮助我们识别内存泄漏的工具!
您应该将其存储到一个临时变量中:
void *temp = realloc(X, Y);
... 然后您可以处理错误,可能是通过清理并正确退出:
if (temp == NULL) {
perror("realloc");
/* free(X); // what would valgrind cease complaining about? */
exit(EXIT_FAILURE);
}
... 并将 X
替换为 temp
:
X = temp;
sizeof(int)
不应假设为与 sizeof str
相同的大小(无论 str
是什么)。鉴于 arr->array
的类型,我希望 sizeof str
或者,更好的是,这里有一个很好的模式要记住:
// X = realloc(Y, Z); or ...
void *temp = realloc(arr, sizeof *arr + arr->size * sizeof arr->array[0]);
// XXX: handle errors
The question is: whenever
arr
is realloc'd to be one bigger, do you have to allocate memory for the strings of the new element?
字符串本身应该位于列表节点的单独存储位置。这是什么?字符串和列表节点,在同一个数组中?!
我想如果您所说的字符串是指固定宽度、空填充字段,这可能是有道理的。固定字段的宽度使得在一维空间中表达数组变得更加容易。
否则,您应该让您的字符串与您的列表节点分开分配...以下游程序员完全控制的方式,如果我可以添加,有点不错,虽然你在使用 realloc
、malloc
等的那一刻失去了它(因此在你使用 VLA 的那一刻,嗯!)...
What am I doing wrong?
我想我已经拆开你的代码足以说明:
arr
指向一些变量,这些变量在没有首先被初始化的情况下使用。sizeof(int)
和 sizeof (/*any pointer type*/)
具有相同的宽度。在非常真实的系统中,这不会是真的。X = realloc(Y, Z);
模式,然后是错误处理,然后是 Y = X;
。malloc
/realloc
/etc 和free
,或者在这里甚至有益。Also, if i try a strcpy into arr->array[arr->size-1].a, it would segfault.
是的,好吧...又出现了与 arr->size
相关的问题!
关于c - 重新分配具有灵活数组的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21806173/
我有以下几行代码: using XXX.PAD.PaidServices; using YYY= XXX.PAD.PaidServices.Judet; //// uncomment below fo
我正在寻找一种方法,让 LAN 中的客户端无需任何配置即可找到我的服务器应用程序的所有实例。我不想自己破解某些东西,而是想使用现有的解决方案。就个人而言,我需要用 Python 完成它,但我很乐意听到
我的“问题”或“挑战”有很多问题。但它们都不符合我的需求。好的,我开始了: 我想要一个保存可变属性的数据库。现在我将它们作为列名“硬编码”到数据库中(参见图片)。请参阅“颜色”和“尺寸”。但是如果我想
我正在为我的一个 friend 创建一个网站。我们得到了这些布局,我已经放了一个灵活的背景,可以缩放到当前的浏览器大小。但是放置在背景上的图标需要在缩放窗口时保持相对位置。意味着如果我调整窗口大小,让
案例 通常,您会使用 cellForRowAtIndexPath 委托(delegate)方法来设置单元格。单元格的信息集对于单元格的绘制方式和大小非常重要。 不幸的是,heightForRowAtI
我试图让下面的 div 变得灵活 div { min-width: 500px; max-width: 1000px; width:100%; height: 400px; margin-left:1
我在单元测试方面遇到问题。当我运行测试时,它以 "No tests found" 结束。我正在使用 AppCode 和 Quick/Nimble 框架进行单元测试,但它在 XCode 中也不起作用。
问之前,请理解我的英语不好。 我在 servlet 编程中使用 Class.forName(...) 类。当我访问 servlet 时,我从数据库中获得一行详细的 Controller 信息,指示要使
我创建了一个cron job在 GAE 灵活环境中,每 15 分钟自动运行一次。 但是在创建每个实例时,是否会为每个实例复制相同的 cron 作业?我对此不太确定。 最佳答案 不,不会为每个实例复制
div A 灵活且固定(位于窗口顶部),具有高 z-index,因此下方的元素可以在滚动时从下方通过。 div B 位于 div A 下方,我希望它“粘”在 div A 的底部,因为在调整窗口大小时高
我是 Quick/Nimble 的新手,所以我尝试了一个简单的单元测试: import Quick import Nimble class DarkSkyTests: QuickSpec {
我创建了一个演示。关于表格单元格的灵 active ,我需要一些帮助。 我有一些表格单元格,它们的宽度应该是固定的。 但单元格由标签组成,标签可以是长文本,也可以是短文本。 基于此标签,表格单元格应该
我非常熟悉在代码中需要“水平带”的网站 - 即使他们的内容固定在 960 像素以内,他们的背景也会向左和向右“延伸”。 我知道如何做这些,如果它们只有一种颜色,或者我可以用作背景的一张图片。 最近一位
我在自己编写的网站(无框架或 CMS)上使用 Cloudflare Flexible SSL。一切正常,现在我想在整个网站上使用 HTTPS。我在 Apache Web 服务器上使用 PHP。 我想知
我有这个 Java 接口(interface): public interface Box { public void open(); public void close(); } 这个接
所以我有一个“主要”功能系统,现在可以作为 CMS 使用:用户进入编辑器并从四个模板中选择一个。在模板中,他们单击可以添加图像、文本或两者的部分。 我有一个预览屏幕,可以向他们展示他们正在制作的东西,
下面的 HTML/CSS/Javascript (jQuery) 代码显示了 #makes 选择框。选择一个选项会显示带有相关选项的 #models 选择框。 #makes 选择框偏离中心,#mode
我正在使用固定高度的图像来填充具有渐变颜色的 div,方法如下:背景:透明 url(green_bg.gif) repeat-x scroll 0 0; 但是它只填充一个等于图像高度的高度。根据其中的
我的系统的 GUI 在 1366 X 768 分辨率下运行良好。当它以不同的分辨率显示时,我需要并排滚动,而它不应该这样。此外,当我尝试在 chrome 中按 ctr+- 时,div 和部分变得困惑。
我正在尝试在 google app engine 灵活环境中使用 python 编写日志。 我想使用默认的 python 日志记录库并使用处理程序进行日志记录。这是我的代码: import loggi
我是一名优秀的程序员,十分优秀!