这是一项家庭作业,所以我不想发布任何代码,但我对我所遇到的错误感到非常困惑。
目前我有一个已分配空间的数组,并将指针复制到该数组。现在,我可以使用这个数组进行 memcpy 和 memmove,效果很好。
然而,当我用它进行重新分配时,会出现无效指针错误 - 我完全不知道为什么。
有人可以帮忙吗?
该功能可以将存储块移动到新位置,在这种情况下返回新位置.
例如,我有一个指向数组的指针:
int *arr; // somewhere next it initialized, filled with elements and etc
Run Code Online (Sandbox Code Playgroud)
在某个地方我需要:
void* location = realloc(arr, NEW_SIZE);
Run Code Online (Sandbox Code Playgroud)
旧的内存块会发生什么?
如果realloc返回不是数学的指针到arr,我应该使用下一个代码吗?:
delete arr;
arr = (int*)location;
Run Code Online (Sandbox Code Playgroud) 我在这里搜索了很多主题,但他们似乎并没有完全回答我.
我正在尝试用C++做一些动态重新分配od数组.我不能使用STL库中的任何东西,因为我需要在明确禁止STL(向量,...)的作业中使用它.
到目前为止,我已经尝试使用这样的代码进行详细说明:
int * items = new int[3]; //my original array I'm about to resize
int * temp = new int[10];
for (int i = 0; i < 3; i++) temp[i] = items[i];
delete [] items; //is this necessary to delete?
items = new int [10];
for (int i = 0; i < 10; i++) items[i] = temp[i];
delete [] temp;
Run Code Online (Sandbox Code Playgroud)
这似乎有效,但困扰我的是过多的迭代次数.难道这不可能更聪明吗?显然,我正在使用比这更大的阵列.不幸的是,我必须使用数组.
编辑:当我尝试做items = temp;而不是
for (int i = 0; i < 10; i++) …
我遇到一个问题,其中的调用realloc似乎修改了另一个字符串的内容,keyfile.
它应该运行一个以null结尾char*(密钥文件),其中包含500个以上的字符.然而,问题是reallocation我在while-loop中执行似乎修改了密钥文件的内容.
我尝试删除动态重新分配,realloc并for使用大小200*sizeof(int)而不是初始化-loop中的指针.问题仍然存在,keyfile字符串在(重新)分配内存期间被修改,我不知道为什么.我通过在malloc和realloc语句之前和之后打印keyfile-string来确认这一点.
注意:密钥文件仅包含字符a-z,没有数字,空格,换行符或大写.只有26个小写字母的文字.
int **getCharMap(const char *keyfile) {
char *alphabet = "abcdefghijklmnopqrstuvwxyz";
int **charmap = malloc(26*sizeof(int));
for (int i = 0; i < 26; i++) {
charmap[(int) alphabet[i]] = malloc(sizeof(int));
charmap[(int) alphabet[i]][0] = 0; // place a counter at index 0
}
int letter;
int count = 0;
unsigned char c = keyfile[count];
while (c …Run Code Online (Sandbox Code Playgroud) 我有一个简单的函数,每次我想添加一个字符时都会重新分配缓冲区,它一直工作到我想第 24 次重新分配。然后 realloc(): invalid next size 出现。这是代码:
char * addDataChunk(char * data,char c)
{
char * p;
if(data==NULL)
{
data=(char*)malloc(sizeof(char)*2);
data[0]=c;
data[1]='\0';
return data;
}
else
{
if(p = (char*)realloc(data,((strlen(data)+1)*sizeof(char))))
{
data = p;
}
else
{
printf("realloc error\n");
}
data[strlen(data)] = c;
data[strlen(data)+1] = '\0';
return data;
}
}
Run Code Online (Sandbox Code Playgroud)
和错误:
*** Error in `./bootstrap': realloc(): invalid next size: 0x0000000000b9f2a0 ***
Aborted (core dumped)
Run Code Online (Sandbox Code Playgroud) 我有一个 int 数组,当它看到比现有值更高的 int 值时需要增长,有没有办法调用 realloc() 并设置正在创建的内存中的所有新空间?或者我需要循环遍历内存中所有新的空间并将它们一一设置为0?为了清楚起见,下面的代码。
int main(){
int i;
int currentSize = 10;
int *checkList = malloc(sizeof(int) * currentSize);
while((i = readInt(fp))){
if(i > currentSize){
currentSize = i + 1;
checklist = realloc(checkList, sizeof(int) * (i + 1));
//Need to loop through checklist and declare empty mem to 0?
}
if(!checkList[i]) checkList[i]++;
}
//should have an array where seen values index in checklist == 1
}
Run Code Online (Sandbox Code Playgroud) realloc可以返回相同的输入地址或不同的地址.如果它返回一个不同的地址,那么它将在内部解除分配/释放输入内存并将该内容移动到另一个位置并返回该新地址.
请考虑以下情况.
new_ptr = realloc (2000, 10000) // Lets assume the input address is 2000
// Lets assume the new_ptr address is 3000
Run Code Online (Sandbox Code Playgroud)
因此,内部realloc将释放指针指向2000的内存并将这些数据移动到新位置3000并返回3000地址.
现在地址2000指向无效.因此,reallocAPI 未将其分配给NULL .
现在,将该无效地址传递给realloc函数.实时可能存在realloc可能获得无效输入地址的更改.
new_ptr = realloc(2000, 10000)
Run Code Online (Sandbox Code Playgroud)
此2000地址无效,因为它已被前一个释放realloc.现在程序崩溃了.
我可以通过以下方式解决此问题.
if (new_ptr != old_ptr ) {
old_ptr = NULL;
}
Run Code Online (Sandbox Code Playgroud)
由于old_ptr无效.我将它分配给NULL.请确认我的更正.
这是我的完整代码,它看起来可以工作,但效果不是很好。我会接受任何像这样工作的代码。
首先,代码可以工作,但是当我想将第三个名称添加到结构中时,它崩溃了。
还有其他方法可以做到这一点吗?
我需要结构,因为将来我想添加一些其他参数,例如年龄、平均值、性别等。
请帮帮我。
//The student table
typedef struct students {
char name[50];
} students;
//Global params
int scount = 0;
students *s;
//Basic functions
void addNewStudent();
int main()
{
int loop = 1;
char in;
int ch;
printf("Willkommen.\n Wahlen Sie bitte von die folgenden Optionen:\n");
while (loop)
{
printf("\t[1] Neue Student eingeben\n");
printf("\t[9] Programm beenden\n");
scanf(" %c", &in);
while ((ch = getchar()) != '\n');
switch (in)
{
case '1':
addNewStudent();
break;
case '9':
loop = 0;
break;
default: …Run Code Online (Sandbox Code Playgroud) 我有以下用 C 编写的程序:
...
char *answer = NULL;
char *pch = strtok(phrase, " "); // phrase is a string with possibly many words
while (pch) {
char *tmp = translate_word(pch); // returns a string based on pch
void *ptr = realloc(answer, sizeof(answer) + sizeof(tmp) + 1000); // allocate space to answer
if (!ptr) // If realloc fails
return -1;
strcat(answer, tmp); // append tmp to answer
pch = strtok(NULL, " "); // find next word
}
...
Run Code Online (Sandbox Code Playgroud)
问题是 strtok() 表现出奇怪的行为,它返回一个词,该词不存在于 …
我有一个动态数组实现,我正在为泛型类型工作。我的理解是realloc的无效指针错误通常是由于没有使用malloc分配原始指针引起的,但是,我使用的是malloc。
这是我的 array.h 代码
#include <stdlib.h>
#include <stdint.h>
#include <inttypes.h>
struct array {
void *elems;
size_t obj_size;
size_t size;
size_t capacity;
};
struct array* new_array(size_t objsize);
int push_back(struct array* a, const void* value);
Run Code Online (Sandbox Code Playgroud)
数组
#include "array.h"
#include <stdio.h>
#include <string.h>
#define INITIAL_SIZE (1)
#define ARR_AT(a, i) ((void *) ((char *) (a)->elems + (i) * (a)->obj_size))
struct array* new_array(size_t objsize) {
struct array* a;
a = malloc(sizeof a + INITIAL_SIZE * objsize);
if (!a) { return NULL; }
a->elems = malloc(objsize); …Run Code Online (Sandbox Code Playgroud)