While debugging i found that my program stops at: "cout << *ptr ; cout << "\n";" what is wrong with this code?
#include<iostream>
using namespace std;
int *ptr = 0;
void myfun(void);
int main()
{
void myfun();
for(int j = 1; j < 3; j++)
{
ptr = ptr-j ;
cout << *ptr ; cout << "\n";
}
return(0);
}
void myfun(void)
{
int x[3] = {11,12,13};
for(int i = 0; i <3; i++)
{
ptr = &x[i];
ptr = ptr+1;
}
}
You initialized your pointer with zero
int *ptr = 0;
which means that it is a null pointer.
Then you are applying pointer arithmetic to a null pointer. The behavior is undefined. The you are dereferencing the nonsensical pointer obtained in that way. The behavior is undefined.
Note that
void myfun();
in main is not a function call, it is a function declaration. A call to myfun (which was apparently your intent) would look as follows
myfun();
Why did you put that void there in your version of the code?
Your variable ptr is a wild pointer.
Although you let the ptr porint to array x, when the myfun() finish and return the memory of x had been destory. So in the main function, ptr become wild pointer and your program will crash.
You should know that the local variable will be destoried when they are not in their scope.
main function doesn't have access to the data, as scope of the array x[3] is myfun(void). After myfun call (it should be myfun(); instead of void myfun();), ptr will be pointing to an unallocated memory location.
To print the data in main function, you can declare the int x[3] as a global variable.
int *ptr = 0;
void myfun(void);
int x[3] = {11,12,13};
int main()
{
int *temp_ptr;
myfun();
temp_ptr = ptr;
for(int j = 1; j <= 3; j++)
{
temp_ptr = ptr-j ;
cout << *temp_ptr ; cout << "\n";
}
return(0);
}
After following the above answers and a little bit of googling I found out the exact solution to my problem: To return variable sized array from a function.
This is the code:
#include<iostream>
using namespace std;
int * myfun(void);
int main()
{
int *ptr;
ptr = myfun();
int len = (sizeof(ptr)/sizeof(*ptr));
for(int j = 0; j <= len; j++)
{
cout << ptr[j];
}
return(0);
}
int * myfun()
{
static int x[3] = {11,12,13};
return x;
}
Related
The purpose of the Copy function in the following code is to copy an array of integers from one array to another using C++ but the output seems wrong.
What could be the problem here?
#include <iostream>
using namespace std;
void Copy(int old_array[],int new_array[],int length)
{
int *ptr1 = old_array;
int *ptr2 = new_array;
int i = 0;
for(int i=0 ; i<length ; i++)
{
*(ptr2++) = *(ptr1++);
}
for (int i = 0; i <2; i++)
{
cout<<*(ptr2 + i)<<endl;
}
}
int main()
{
int a[2]={0,1};
int b[2];
Copy(a,b,2);
}
This is the output:
ptr2 is one past the end of the array when your print loop runs.
Try this:
void Copy(int old_array[], int new_array[], int length)
{
int* ptr1 = old_array;
int* ptr2 = new_array;
int i = 0;
for (int i = 0; i < length; i++)
{
*(ptr2++) = *(ptr1++);
}
ptr2 = new_array;
for (int i = 0; i < 2; i++)
{
cout << *(ptr2 + i) << endl;
}
}
Your ptr2 is pointing to the element b[2] (which is out-of-bound access) at the time you are printing it in the second for loop.
You can fix it by subtracting the length from the ptr2 in the second for loop like below.
#include <iostream>
using namespace std;
void Copy(int old_array[],int new_array[],int length)
{
int *ptr1 = old_array;
int *ptr2 = new_array;
int i = 0;
for(int i=0 ; i<length ; i++)
{
*(ptr2++) = *(ptr1++);
}
for (int i = 0; i <2; i++)
{
cout<<*(ptr2 + i - length)<<endl;
}
}
int main()
{
int a[2]={0,1};
int b[2];
Copy(a,b,2);
}
The copy seems fine but the second for is accessing ptr2 which was incremented in the first for and is point to some invalid memory position. You could use new_array in this second loop.
I suppose this second loop is only for debug and will be better located in the main using, in you case, the variable b.
I want to create a function which generates an array(filled with random numbers) of the size I give as an input and the function returns the address of the first element of the generated array. I wrote the code as best as possible without any errors or warning. But at the runtime, the program crashes. I try to debug it but the debugger also froze and do nothing. I think the problem is in returning the pointer. Please help.
#include<iostream>
#include<cstdlib>
using namespace std;
int** the_gen(int num)
{
srand(1000);
int *ptr= new int(num);
int** const dptr=&ptr;
for(int i=0;i<num;i++)
{
*ptr= rand();
ptr++;
}
return dptr;
}
int main()
{
cout<<"Size of array:"<<endl;
int size_of_array;
cin>>size_of_array;
int **a;
a=the_gen(size_of_array);
for(int i=0;i<size_of_array;i++)
{
cout<<**a<<",";
a++;
}
}
you were using int** unnecessarily. only need to use that if you're creating an array of int pointers or a 2d array of int's:
the following code does what you're after i think:
#include<iostream>
#include<cstdlib>
using namespace std;
int* the_gen(int num)
{
srand(1000);
//edit
int *ptr = new int[num];
int* const dptr = ptr;
for (int i = 0; i < num; i++)
{
*ptr = rand();
ptr++;
}
return dptr;
}
int main()
{
cout << "Size of array:" << endl;
int size_of_array;
cin >> size_of_array;
int *a;
a = the_gen(size_of_array);
for (int i = 0; i < size_of_array; i++)
{
cout << *a << ",";
a++;
}
}
I think returning pointer is always bad idea, we should take memory pointers as a parameter as the follow
void the_gen(int num, int** arry)
{
srand(1000);
int *ptr = new int[num];
*arry = ptr;
for (int i = 0; i < num; i++)
{
ptr[i] = rand();
}
}
int main()
{
cout << "Size of array:" << endl;
int size_of_array;
cin >> size_of_array;
int *a;
the_gen(size_of_array, &a);
for (int i = 0; i < size_of_array; i++)
{
cout << a[i] << ",";
}
}
I have to use pointers to copy values of one array to another. The problem is I'm not allowed to use'[ ]' operators, which makes this more difficult for me. Here is my attempt:
#include <iostream>
using namespace std;
void cpyia(int old_array[],int new_array[],int length){
int *p1 = old_array;
int *p2 = new_array;
int *x = p2;
for(int i=0 ; i<length ; i++){
p2 = x;
p2 = p2 + i;
p2 = p1 + i;
}
for(int i=0; i<5; ++i){
cout << p2[i] << endl;
}
}
int main() {
int a[5]={1,2,3,4,5};
int b[5];
cpyia(a, b, 5);
}
An easier way to do it would be to put p2[i] = p1[i] in the loop, but I cant do that. Any help is appreciated.
The standard way of implementing your function is as follow:
for(int i = 0; i < length; ++i)
*new_array++ = *old_array++;
To be a bit more explicit, it's the same as:
void cpyia(int old_array[],int new_array[],int length){
int *p1 = old_array;
int *p2 = new_array;
for(int i=0 ; i<length ; i++){
*(p2+i) = *(p1+i);
// another way: *(p2++) = *(p1++);
}
}
In real code, you would use std::copy before even thinking about rewriting such a simple thing yourself.
Here is a complete example:
#include <iostream>
#include <algorithm>
void cpyia(int old_array[],int new_array[],int length){
std::copy(old_array, old_array + length, new_array);
}
int main() {
int a[5]={1,2,3,4,5};
int b[5];
cpyia(a, b, 5);
// test results:
for (int index = 0; index < 5; ++index)
{
std::cout << a[index] << " <-> " << b[index] << "\n";
}
}
However, your question says that you are "not allowed to use" something, which sounds a lot like a homework assignment. In that case, you could look at possible implementations of std::copy to get an idea of how to do it. Here is one way:
void cpyia(int old_array[],int new_array[],int length){
int* first = old_array;
int* last = old_array + length;
int* d_first = new_array;
while (first != last) {
*d_first++ = *first++;
}
}
#include<iostream>
using namespace std;
int main() {
const int size = 5;
int arr1[size] = { 4,21,43,9,77 };
int arr2[size];
int *ptr_a = arr1;
int *ptr_b = arr2;
for (int i = 0; i < size; i++)
{
*(ptr_b + i) = *(ptr_a + i);
cout << *(ptr_b + i) << " ";
}
}
#include <iostream>
using namespace std;
char problem5(char alc[], char a, int *n);
int main() {
char aloc1[]={ 'g','g','c','g','a','g','g','g','t','g'};
int size=sizeof(aloc1)/sizeof(aloc1[0]);
cout << aloc1 << endl;
int nalc = problem5(aloc1, 'g' ,&size);
cout << nalc << endl;
return 0;
}
char problem5(char alc[], char c, int *n){
int a = 0;
for(int i = 0; i < n; i++){
if(alc[0]!=c){
a++;
}
}
int nalc[a];
int b=0;
for(int j = 0; j < n; j++){
if(alc[0]!=c){
nalc[b]=alc[j];
b++;
}
}
*n=&a;
return nalc;
}
why do I keep having errors at the two for loops of the problem5?
it says something like comparison between pointer and int.
how can i fix that while the argument n remains pointer.
Use *n to access the value pointed by n:
for(int i = 0; i < *n; i++){
And to change the value pointed by n to be equal to a:
*n = a;
You can't have an address in a for-loop. Try dereferencing the pointer. and also post your exact error please.
I got a problem with the following code:
#include <iostream>
using namespace std;
double* FillArray(void)
{
double result[5];
for (int i = 0; i<5;i++){
result[i]=(double) i;
}
return result; // return the pointer
}
int main()
{
double * a = FillArray();
for (int i = 0; i<5;i++){
cout << a[i] << endl; // print out the array
}
return 0;
}
The outputs are strange:
0
3.47187e-236
8.89753e-308
8.8976e-308
3.90251e-236
Could you tell what wrong in my code?
I tried to use a function to return an array, and print out it in the main().
You are returning a pointer to a local variable, the array result. This is undefined behaviour. The variable ceases to exist when the function returns, so by the time you get to printing, you print garbage values.
If you really want to return an array, you can use an std::array:
typedef std::array<double, 5> DArray5;
DArray5 FillArray()
{
DArray5 result;
for (size_t i = 0; i < result.size(); ++i){
result[i] = i;
}
return result;
}
Edit This is a C++ only answer. There is no C/C++ language.
result is allocated in the stack. Try allocating it in the heap, like this:
double* result = new double[5];
The array called result get released. Try this code:
#include <iostream>
using namespace std;
void FillArray(double *result)
{
for (int i = 0; i<5;i++){
result[i]=(double) i;
}
}
int main()
{
double result[5];
FillArray(result);
for (int i = 0; i<5;i++){
cout << result[i] << endl; // print out the array
}
return 0;
}
This is WRONG:
double* FillArray(void)
{
// Result ONLY has scope INSIDE of the FillArray function
double result[5];
for (int i = 0; i<5;i++){
result[i]=(double) i;
}
// Bad things will happen when the caller tries to use (now-invalid) "result"
return result;
Here is one correct alternative:
#define ARRAY_SIZE 5
main ()
double result[ARRAY_SIZE];
FillArray (result, ARRAY_SIZE);
for (int i = 0; i<ARRAY_SIZE;i++){
cout << result[i] << endl; // print out the array
}
...
void FillArray(double *array, int n)
{
for (int i = 0; i<n;i++){
array[i]=(double) i;